{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "**PCA实战task**\n",
    "- 1、基于iris.csv数据，建立KNN模型实现数据分类（n_neighbors=3）\n",
    "- 2、对数据进行标准化处理，选取一个维度可视化处理后的效果\n",
    "- 3、进行与元数据等维度PCA，查看各主成分的方差比例\n",
    "- 4、保留合适的主成分，可视化姜维后的数据\n",
    "- 5、基于降维后的数据建立KNN模型，与原数据表现进行对比"
   ],
   "id": "70d2ecebf770d34f"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:40:49.973037Z",
     "start_time": "2025-06-21T10:40:49.946554Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# load data\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "data = pd.read_csv('../data/iris.csv')\n",
    "data['label'] = data['class'].map({'SETOSA': 0, 'VERSICOLOR': 1, 'VIRGINICA': 2})\n",
    "data.head()"
   ],
   "id": "f54c6a1488ec478d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   sepal_length  sepal_width  petal_length  petal_width   class  label\n",
       "0           5.1          3.5           1.4          0.2  SETOSA      0\n",
       "1           4.9          3.0           1.4          0.2  SETOSA      0\n",
       "2           4.7          3.2           1.3          0.2  SETOSA      0\n",
       "3           4.6          3.1           1.5          0.2  SETOSA      0\n",
       "4           5.0          3.6           1.4          0.2  SETOSA      0"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "      <th>class</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>SETOSA</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>SETOSA</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>SETOSA</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>SETOSA</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>SETOSA</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:40:50.102854Z",
     "start_time": "2025-06-21T10:40:50.092438Z"
    }
   },
   "cell_type": "code",
   "source": [
    "x = data.drop(['class','label'],axis=1)\n",
    "y = data['label']\n",
    "y.head()"
   ],
   "id": "23702c0ae68af0db",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0\n",
       "1    0\n",
       "2    0\n",
       "3    0\n",
       "4    0\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:40:58.689017Z",
     "start_time": "2025-06-21T10:40:50.624802Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# establish knn model and calculate the accuracy\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "knn = KNeighborsClassifier(n_neighbors=3)\n",
    "knn.fit(x,y)\n",
    "y_predict = knn.predict(x)\n",
    "from sklearn.metrics import accuracy_score\n",
    "accuracy = accuracy_score(y,y_predict)\n",
    "print(accuracy)"
   ],
   "id": "a1621706e70bfc55",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.96\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:40:59.207670Z",
     "start_time": "2025-06-21T10:40:59.028082Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "x_norm = StandardScaler().fit_transform(x)\n",
    "print(x_norm)"
   ],
   "id": "f2e1069dd846a573",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-9.00681170e-01  1.03205722e+00 -1.34127240e+00 -1.31297673e+00]\n",
      " [-1.14301691e+00 -1.24957601e-01 -1.34127240e+00 -1.31297673e+00]\n",
      " [-1.38535265e+00  3.37848329e-01 -1.39813811e+00 -1.31297673e+00]\n",
      " [-1.50652052e+00  1.06445364e-01 -1.28440670e+00 -1.31297673e+00]\n",
      " [-1.02184904e+00  1.26346019e+00 -1.34127240e+00 -1.31297673e+00]\n",
      " [-5.37177559e-01  1.95766909e+00 -1.17067529e+00 -1.05003079e+00]\n",
      " [-1.50652052e+00  8.00654259e-01 -1.34127240e+00 -1.18150376e+00]\n",
      " [-1.02184904e+00  8.00654259e-01 -1.28440670e+00 -1.31297673e+00]\n",
      " [-1.74885626e+00 -3.56360566e-01 -1.34127240e+00 -1.31297673e+00]\n",
      " [-1.14301691e+00  1.06445364e-01 -1.28440670e+00 -1.44444970e+00]\n",
      " [-5.37177559e-01  1.49486315e+00 -1.28440670e+00 -1.31297673e+00]\n",
      " [-1.26418478e+00  8.00654259e-01 -1.22754100e+00 -1.31297673e+00]\n",
      " [-1.26418478e+00 -1.24957601e-01 -1.34127240e+00 -1.44444970e+00]\n",
      " [-1.87002413e+00 -1.24957601e-01 -1.51186952e+00 -1.44444970e+00]\n",
      " [-5.25060772e-02  2.18907205e+00 -1.45500381e+00 -1.31297673e+00]\n",
      " [-1.73673948e-01  3.11468391e+00 -1.28440670e+00 -1.05003079e+00]\n",
      " [-5.37177559e-01  1.95766909e+00 -1.39813811e+00 -1.05003079e+00]\n",
      " [-9.00681170e-01  1.03205722e+00 -1.34127240e+00 -1.18150376e+00]\n",
      " [-1.73673948e-01  1.72626612e+00 -1.17067529e+00 -1.18150376e+00]\n",
      " [-9.00681170e-01  1.72626612e+00 -1.28440670e+00 -1.18150376e+00]\n",
      " [-5.37177559e-01  8.00654259e-01 -1.17067529e+00 -1.31297673e+00]\n",
      " [-9.00681170e-01  1.49486315e+00 -1.28440670e+00 -1.05003079e+00]\n",
      " [-1.50652052e+00  1.26346019e+00 -1.56873522e+00 -1.31297673e+00]\n",
      " [-9.00681170e-01  5.69251294e-01 -1.17067529e+00 -9.18557817e-01]\n",
      " [-1.26418478e+00  8.00654259e-01 -1.05694388e+00 -1.31297673e+00]\n",
      " [-1.02184904e+00 -1.24957601e-01 -1.22754100e+00 -1.31297673e+00]\n",
      " [-1.02184904e+00  8.00654259e-01 -1.22754100e+00 -1.05003079e+00]\n",
      " [-7.79513300e-01  1.03205722e+00 -1.28440670e+00 -1.31297673e+00]\n",
      " [-7.79513300e-01  8.00654259e-01 -1.34127240e+00 -1.31297673e+00]\n",
      " [-1.38535265e+00  3.37848329e-01 -1.22754100e+00 -1.31297673e+00]\n",
      " [-1.26418478e+00  1.06445364e-01 -1.22754100e+00 -1.31297673e+00]\n",
      " [-5.37177559e-01  8.00654259e-01 -1.28440670e+00 -1.05003079e+00]\n",
      " [-7.79513300e-01  2.42047502e+00 -1.28440670e+00 -1.44444970e+00]\n",
      " [-4.16009689e-01  2.65187798e+00 -1.34127240e+00 -1.31297673e+00]\n",
      " [-1.14301691e+00  1.06445364e-01 -1.28440670e+00 -1.44444970e+00]\n",
      " [-1.02184904e+00  3.37848329e-01 -1.45500381e+00 -1.31297673e+00]\n",
      " [-4.16009689e-01  1.03205722e+00 -1.39813811e+00 -1.31297673e+00]\n",
      " [-1.14301691e+00  1.06445364e-01 -1.28440670e+00 -1.44444970e+00]\n",
      " [-1.74885626e+00 -1.24957601e-01 -1.39813811e+00 -1.31297673e+00]\n",
      " [-9.00681170e-01  8.00654259e-01 -1.28440670e+00 -1.31297673e+00]\n",
      " [-1.02184904e+00  1.03205722e+00 -1.39813811e+00 -1.18150376e+00]\n",
      " [-1.62768839e+00 -1.74477836e+00 -1.39813811e+00 -1.18150376e+00]\n",
      " [-1.74885626e+00  3.37848329e-01 -1.39813811e+00 -1.31297673e+00]\n",
      " [-1.02184904e+00  1.03205722e+00 -1.22754100e+00 -7.87084847e-01]\n",
      " [-9.00681170e-01  1.72626612e+00 -1.05694388e+00 -1.05003079e+00]\n",
      " [-1.26418478e+00 -1.24957601e-01 -1.34127240e+00 -1.18150376e+00]\n",
      " [-9.00681170e-01  1.72626612e+00 -1.22754100e+00 -1.31297673e+00]\n",
      " [-1.50652052e+00  3.37848329e-01 -1.34127240e+00 -1.31297673e+00]\n",
      " [-6.58345429e-01  1.49486315e+00 -1.28440670e+00 -1.31297673e+00]\n",
      " [-1.02184904e+00  5.69251294e-01 -1.34127240e+00 -1.31297673e+00]\n",
      " [ 1.40150837e+00  3.37848329e-01  5.35295827e-01  2.64698913e-01]\n",
      " [ 6.74501145e-01  3.37848329e-01  4.21564419e-01  3.96171883e-01]\n",
      " [ 1.28034050e+00  1.06445364e-01  6.49027235e-01  3.96171883e-01]\n",
      " [-4.16009689e-01 -1.74477836e+00  1.37235899e-01  1.33225943e-01]\n",
      " [ 7.95669016e-01 -5.87763531e-01  4.78430123e-01  3.96171883e-01]\n",
      " [-1.73673948e-01 -5.87763531e-01  4.21564419e-01  1.33225943e-01]\n",
      " [ 5.53333275e-01  5.69251294e-01  5.35295827e-01  5.27644853e-01]\n",
      " [-1.14301691e+00 -1.51337539e+00 -2.60824029e-01 -2.61192967e-01]\n",
      " [ 9.16836886e-01 -3.56360566e-01  4.78430123e-01  1.33225943e-01]\n",
      " [-7.79513300e-01 -8.19166497e-01  8.03701950e-02  2.64698913e-01]\n",
      " [-1.02184904e+00 -2.43898725e+00 -1.47092621e-01 -2.61192967e-01]\n",
      " [ 6.86617933e-02 -1.24957601e-01  2.50967307e-01  3.96171883e-01]\n",
      " [ 1.89829664e-01 -1.97618132e+00  1.37235899e-01 -2.61192967e-01]\n",
      " [ 3.10997534e-01 -3.56360566e-01  5.35295827e-01  2.64698913e-01]\n",
      " [-2.94841818e-01 -3.56360566e-01 -9.02269170e-02  1.33225943e-01]\n",
      " [ 1.03800476e+00  1.06445364e-01  3.64698715e-01  2.64698913e-01]\n",
      " [-2.94841818e-01 -1.24957601e-01  4.21564419e-01  3.96171883e-01]\n",
      " [-5.25060772e-02 -8.19166497e-01  1.94101603e-01 -2.61192967e-01]\n",
      " [ 4.32165405e-01 -1.97618132e+00  4.21564419e-01  3.96171883e-01]\n",
      " [-2.94841818e-01 -1.28197243e+00  8.03701950e-02 -1.29719997e-01]\n",
      " [ 6.86617933e-02  3.37848329e-01  5.92161531e-01  7.90590793e-01]\n",
      " [ 3.10997534e-01 -5.87763531e-01  1.37235899e-01  1.33225943e-01]\n",
      " [ 5.53333275e-01 -1.28197243e+00  6.49027235e-01  3.96171883e-01]\n",
      " [ 3.10997534e-01 -5.87763531e-01  5.35295827e-01  1.75297293e-03]\n",
      " [ 6.74501145e-01 -3.56360566e-01  3.07833011e-01  1.33225943e-01]\n",
      " [ 9.16836886e-01 -1.24957601e-01  3.64698715e-01  2.64698913e-01]\n",
      " [ 1.15917263e+00 -5.87763531e-01  5.92161531e-01  2.64698913e-01]\n",
      " [ 1.03800476e+00 -1.24957601e-01  7.05892939e-01  6.59117823e-01]\n",
      " [ 1.89829664e-01 -3.56360566e-01  4.21564419e-01  3.96171883e-01]\n",
      " [-1.73673948e-01 -1.05056946e+00 -1.47092621e-01 -2.61192967e-01]\n",
      " [-4.16009689e-01 -1.51337539e+00  2.35044910e-02 -1.29719997e-01]\n",
      " [-4.16009689e-01 -1.51337539e+00 -3.33612130e-02 -2.61192967e-01]\n",
      " [-5.25060772e-02 -8.19166497e-01  8.03701950e-02  1.75297293e-03]\n",
      " [ 1.89829664e-01 -8.19166497e-01  7.62758643e-01  5.27644853e-01]\n",
      " [-5.37177559e-01 -1.24957601e-01  4.21564419e-01  3.96171883e-01]\n",
      " [ 1.89829664e-01  8.00654259e-01  4.21564419e-01  5.27644853e-01]\n",
      " [ 1.03800476e+00  1.06445364e-01  5.35295827e-01  3.96171883e-01]\n",
      " [ 5.53333275e-01 -1.74477836e+00  3.64698715e-01  1.33225943e-01]\n",
      " [-2.94841818e-01 -1.24957601e-01  1.94101603e-01  1.33225943e-01]\n",
      " [-4.16009689e-01 -1.28197243e+00  1.37235899e-01  1.33225943e-01]\n",
      " [-4.16009689e-01 -1.05056946e+00  3.64698715e-01  1.75297293e-03]\n",
      " [ 3.10997534e-01 -1.24957601e-01  4.78430123e-01  2.64698913e-01]\n",
      " [-5.25060772e-02 -1.05056946e+00  1.37235899e-01  1.75297293e-03]\n",
      " [-1.02184904e+00 -1.74477836e+00 -2.60824029e-01 -2.61192967e-01]\n",
      " [-2.94841818e-01 -8.19166497e-01  2.50967307e-01  1.33225943e-01]\n",
      " [-1.73673948e-01 -1.24957601e-01  2.50967307e-01  1.75297293e-03]\n",
      " [-1.73673948e-01 -3.56360566e-01  2.50967307e-01  1.33225943e-01]\n",
      " [ 4.32165405e-01 -3.56360566e-01  3.07833011e-01  1.33225943e-01]\n",
      " [-9.00681170e-01 -1.28197243e+00 -4.31421141e-01 -1.29719997e-01]\n",
      " [-1.73673948e-01 -5.87763531e-01  1.94101603e-01  1.33225943e-01]\n",
      " [ 5.53333275e-01  5.69251294e-01  1.27454998e+00  1.71090158e+00]\n",
      " [-5.25060772e-02 -8.19166497e-01  7.62758643e-01  9.22063763e-01]\n",
      " [ 1.52267624e+00 -1.24957601e-01  1.21768427e+00  1.18500970e+00]\n",
      " [ 5.53333275e-01 -3.56360566e-01  1.04708716e+00  7.90590793e-01]\n",
      " [ 7.95669016e-01 -1.24957601e-01  1.16081857e+00  1.31648267e+00]\n",
      " [ 2.12851559e+00 -1.24957601e-01  1.61574420e+00  1.18500970e+00]\n",
      " [-1.14301691e+00 -1.28197243e+00  4.21564419e-01  6.59117823e-01]\n",
      " [ 1.76501198e+00 -3.56360566e-01  1.44514709e+00  7.90590793e-01]\n",
      " [ 1.03800476e+00 -1.28197243e+00  1.16081857e+00  7.90590793e-01]\n",
      " [ 1.64384411e+00  1.26346019e+00  1.33141568e+00  1.71090158e+00]\n",
      " [ 7.95669016e-01  3.37848329e-01  7.62758643e-01  1.05353673e+00]\n",
      " [ 6.74501145e-01 -8.19166497e-01  8.76490051e-01  9.22063763e-01]\n",
      " [ 1.15917263e+00 -1.24957601e-01  9.90221459e-01  1.18500970e+00]\n",
      " [-1.73673948e-01 -1.28197243e+00  7.05892939e-01  1.05353673e+00]\n",
      " [-5.25060772e-02 -5.87763531e-01  7.62758643e-01  1.57942861e+00]\n",
      " [ 6.74501145e-01  3.37848329e-01  8.76490051e-01  1.44795564e+00]\n",
      " [ 7.95669016e-01 -1.24957601e-01  9.90221459e-01  7.90590793e-01]\n",
      " [ 2.24968346e+00  1.72626612e+00  1.67260991e+00  1.31648267e+00]\n",
      " [ 2.24968346e+00 -1.05056946e+00  1.78634131e+00  1.44795564e+00]\n",
      " [ 1.89829664e-01 -1.97618132e+00  7.05892939e-01  3.96171883e-01]\n",
      " [ 1.28034050e+00  3.37848329e-01  1.10395287e+00  1.44795564e+00]\n",
      " [-2.94841818e-01 -5.87763531e-01  6.49027235e-01  1.05353673e+00]\n",
      " [ 2.24968346e+00 -5.87763531e-01  1.67260991e+00  1.05353673e+00]\n",
      " [ 5.53333275e-01 -8.19166497e-01  6.49027235e-01  7.90590793e-01]\n",
      " [ 1.03800476e+00  5.69251294e-01  1.10395287e+00  1.18500970e+00]\n",
      " [ 1.64384411e+00  3.37848329e-01  1.27454998e+00  7.90590793e-01]\n",
      " [ 4.32165405e-01 -5.87763531e-01  5.92161531e-01  7.90590793e-01]\n",
      " [ 3.10997534e-01 -1.24957601e-01  6.49027235e-01  7.90590793e-01]\n",
      " [ 6.74501145e-01 -5.87763531e-01  1.04708716e+00  1.18500970e+00]\n",
      " [ 1.64384411e+00 -1.24957601e-01  1.16081857e+00  5.27644853e-01]\n",
      " [ 1.88617985e+00 -5.87763531e-01  1.33141568e+00  9.22063763e-01]\n",
      " [ 2.49201920e+00  1.72626612e+00  1.50201279e+00  1.05353673e+00]\n",
      " [ 6.74501145e-01 -5.87763531e-01  1.04708716e+00  1.31648267e+00]\n",
      " [ 5.53333275e-01 -5.87763531e-01  7.62758643e-01  3.96171883e-01]\n",
      " [ 3.10997534e-01 -1.05056946e+00  1.04708716e+00  2.64698913e-01]\n",
      " [ 2.24968346e+00 -1.24957601e-01  1.33141568e+00  1.44795564e+00]\n",
      " [ 5.53333275e-01  8.00654259e-01  1.04708716e+00  1.57942861e+00]\n",
      " [ 6.74501145e-01  1.06445364e-01  9.90221459e-01  7.90590793e-01]\n",
      " [ 1.89829664e-01 -1.24957601e-01  5.92161531e-01  7.90590793e-01]\n",
      " [ 1.28034050e+00  1.06445364e-01  9.33355755e-01  1.18500970e+00]\n",
      " [ 1.03800476e+00  1.06445364e-01  1.04708716e+00  1.57942861e+00]\n",
      " [ 1.28034050e+00  1.06445364e-01  7.62758643e-01  1.44795564e+00]\n",
      " [-5.25060772e-02 -8.19166497e-01  7.62758643e-01  9.22063763e-01]\n",
      " [ 1.15917263e+00  3.37848329e-01  1.21768427e+00  1.44795564e+00]\n",
      " [ 1.03800476e+00  5.69251294e-01  1.10395287e+00  1.71090158e+00]\n",
      " [ 1.03800476e+00 -1.24957601e-01  8.19624347e-01  1.44795564e+00]\n",
      " [ 5.53333275e-01 -1.28197243e+00  7.05892939e-01  9.22063763e-01]\n",
      " [ 7.95669016e-01 -1.24957601e-01  8.19624347e-01  1.05353673e+00]\n",
      " [ 4.32165405e-01  8.00654259e-01  9.33355755e-01  1.44795564e+00]\n",
      " [ 6.86617933e-02 -1.24957601e-01  7.62758643e-01  7.90590793e-01]]\n"
     ]
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:47:52.788794Z",
     "start_time": "2025-06-21T10:47:52.777126Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# calculate the mean and sigma\n",
    "x1_mean = x.loc[:,'sepal_length'].mean()\n",
    "x1_norm_mean = x_norm[:,0].mean()\n",
    "x1_sigma = x.loc[:,'sepal_length'].std()\n",
    "x1_norm_sigma = x_norm[:,0].std()\n",
    "print(x1_mean,x1_norm_mean,x1_sigma,x1_norm_sigma)"
   ],
   "id": "b65895676525025f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5.843333333333334 -4.736951571734001e-16 0.828066127977863 1.0\n"
     ]
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:45:40.278559Z",
     "start_time": "2025-06-21T10:45:39.296315Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from matplotlib import pyplot as plt\n",
    "fig1 = plt.figure(figsize=(10,5))\n",
    "plt.subplot(1,2,1)\n",
    "plt.hist(x.loc[:,'sepal_length'], bins=100)\n",
    "plt.subplot(1,2,2)\n",
    "plt.hist(x_norm[:,0], bins=100)\n",
    "plt.show()"
   ],
   "id": "1c23abffc5c06da5",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzYAAAGsCAYAAAAPLTJNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAH0FJREFUeJzt3QmwXuP9B/AnEpLQJHYSW2KrJfatlrYMlSGUMaPVCU1Raywpg6S1NKMk1KixjK21DbF0KqgUgxZjqyWopXbhomRMybW0V5uc/zync+/fjdzce3nvfc/vvp/PzEnue+5573nuc5/3/N7ve573vP2KoigSAABAYIvVuwEAAABfl2ADAACEJ9gAAADhCTYAAEB4gg0AABCeYAMAAIQn2AAAAOENSBUzf/789O6776YhQ4akfv361bs5AA0lf7TZxx9/nEaMGJEWW8xrX63UJoDq16XKBZtcOFZbbbV6NwOgoTU1NaVVV1213s2oDLUJoPp1qXLBJr8a1tr4oUOH1rs5AA2lubm5fALfeizmf9QmgOrXpcoFm9ZT/LlwKB4A9WG6VXtqE0D165IJ1AAAQHiCDQAAEJ5gAwAAhCfYAAAA4Qk2AABAeIINAAAQnmADAACEJ9gAAADhCTYAAEB4gg0AABCeYAMAAIQn2AAAAI0XbB544IG05557phEjRqR+/fqlW265pd33i6JIp556aho+fHgaPHhw2mWXXdIrr7xSyzYDQBt1CYCvFGw+/fTTtMkmm6SLLrpood8/++yz0/nnn58uueSS9Ne//jUttdRSacyYMenf//63Hgeg5tQlALIB3e2G3XbbrVwWJr8qdt5556WTTz457bXXXuW6a665Jq200krlK2j77befXgegptQlAGr+Hps33ngjvffee+Vp/lbDhg1L22yzTXrkkUcWep+WlpbU3NzcbgGAetWlTG0CaIAzNouSi0eWXwn7ony79XsLmjp1apoyZUotm9GQRk6a2fb17Glj69oWgKr4KnUpU5tqQ20CGuqqaJMnT05z585tW5qamurdJAAanNoE0ODBZuWVVy7/f//999utz7dbv7eggQMHpqFDh7ZbAKBedSlTmwAaPNiMGjWqLBT33ntv27o8LzlfhWbbbbet5a4AoFPqEkDj6PZ7bD755JP06quvtntj5tNPP52WXXbZtPrqq6eJEyemX/3qV2md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7qN++QoCPfGDL7zwwvTrX/86vffee2nTTTdN559/fvmBaABQD+oSQN/WY8EGAAAg7HtsAAAAeptgAwAAhCfYAAAA4Qk2AABAeIJNSmnatGmpX79+aeLEiR1uc9VVV5XbfHEZNGhQr7Xxl7/85Zf2v9566y3yPr///e/LbXI7N9poo/SnP/2psu2td/+2euedd9L++++flltuuTR48OCy35544olF3ue+++5Lm2++eXlZxbXXXrv8Xara3tzWBfs5L/kqUb1h5MiRC93/hAkTKjmOu9veKozjefPmpVNOOSWNGjWqHBNrrbVWOv3001Nn14mp5zjuK2bPnp0OPvjgdn2fL7n6+eef17tplXLGGWek7bbbLi255JJp6aWXrndzKuOiiy4qjzn5mJGv1vfYY4/Vu0mV8sADD6Q999wzjRgxojy23nLLLfVuUuVMnTo1bbXVVmnIkCFpxRVXTHvvvXd66aWXUiPpkc+xieTxxx9Pl156adp444073Xbo0KHtBkh+YPWmDTfcMN1zzz1ttwcM6PjP9/DDD6cf/ehH5SDfY4890vTp08sBPmvWrDR69OjKtbcK/fvhhx+m7bffPu20007pjjvuSCussEJ65ZVX0jLLLNPhfd544400duzYdPjhh6frrruu/MC/n/70p2n48OFpzJgxlWtvq9zPub9b5QNgbz3e8hPvVs8991z63ve+l/bdd99KjuPutrcK4/iss85KF198cbr66qvLx2AOuvmzWoYNG5aOOeaYyo3jvuTFF18sP/gz15QcDvN4OeSQQ8rPyznnnHPq3bzKyEEvP4byh6P+7ne/q3dzKuHGG28sP2vpkksuKUNN/pyl/NjLx5LeOj5XXX4cbbLJJumggw5K++yzT72bU0n3339/+cJbDjf//e9/089//vO06667phdeeCEttdRSqSEUDezjjz8u1llnneLuu+8uvvvd7xbHHntsh9teeeWVxbBhw4p6Oe2004pNNtmky9v/4Ac/KMaOHdtu3TbbbFMcdthhRRXbW+/+zU466aRihx126NZ9TjzxxGLDDTdst+6HP/xhMWbMmKKK7f3LX/6SX7YvPvzww6IK8mNurbXWKubPn1/JcbygztpbhXGc++uggw5qt26fffYpxo0bV8lx3NedffbZxahRo+rdjEqqwuOlKrbeeutiwoQJbbfnzZtXjBgxopg6dWpd21VVuY7NmDGj3s2ovDlz5pR9df/99xeNoqGnouVUm1+l3GWXXbq0/SeffJLWWGONtNpqq6W99torPf/886k35Vfj8ynYNddcM40bNy699dZbHW77yCOPfOn3yq/+5PVVbG8V+ve2224rP5U8v5KYXyHbbLPN0uWXX77I+9Szn79Ke1vlDyfMr8bnsw8PPfRQqterttdee2356ltHZzWqMI67094qjOM8xSefcXn55ZfL288880x68MEH02677dbhfarUz33N3Llz07LLLlvvZlBh+djy5JNPtnsMLrbYYuVtj0G+7vEna6RjUMMGmxtuuKGczpKnuHTFN7/5zXTFFVekW2+9tXxyk6cb5CcQb7/9duoN+dR0nvN+5513ltNM8tSRb3/72+njjz9e6Pb5PRMrrbRSu3X5dm+9l6K77a13/2avv/562dZ11lkn3XXXXemII44op+7kKT0d6aifm5ub07/+9a/KtTeHmTzV4Q9/+EO55CffO+64Y/lY6G15fvRHH32UfvKTn3S4Tb3HcXfbW4VxPGnSpLTffvuV70tafPHFy8Cb3z+YX1yo4jjuy1599dV0wQUXpMMOO6zeTaHCPvjgg3LKa1WOdfQN8+fPL4/9ecp6b70FoRKKBvTWW28VK664YvHMM8+0retsKtqCPv/883JKysknn1zUQ55KNHTo0OK3v/3tQr+/+OKLF9OnT2+37qKLLip/7yq2twr9m/ts2223bbfu6KOPLr71rW91eJ88lfHMM89st27mzJnlqd/PPvusqFp7F+Y73/lOsf/++xe9bddddy322GOPRW5TpXHclfZWYRxff/31xaqrrlr+/7e//a245pprimWXXba46qqrKjmOI8jTPnNfLGr5+9//3u4+b7/9dvm3P/jgg4tG8FX6yFS0/3nnnXfK/nn44YfbrT/hhBPKKWp8malonTv88MOLNdZYo2hqaioaSUNePCCf8p0zZ055BaBW+dWSfMWNCy+8MLW0tKT+/fsv8me0vhKaX5Grh3wlmXXXXbfD/a+88srp/fffb7cu387rq9jeKvRvPpuxwQYbtFu3/vrrl2c2OtJRP+c3kOerIlWtvQuz9dZbl1OVetObb75ZXlji5ptvXuR2VRnHXW1vFcbxCSec0HbWJstXksvtz2enx48fX7lxHMHxxx+/yDN1WZ5y2+rdd98tL+qRz9ZddtllqRF0t4/4f8svv3z5nKMKxzr6hqOOOirdfvvt5fPaVVddNTWShgw2O++8c3r22WfbrctXDcpTN0466aROQ01rEMo/Y/fdd0/1kOfxv/baa+mAAw5Y6Pfz1WbyPPsvXsL67rvvLtdXsb1V6N98unbByyLm9ynk90t0JPfngpcf7q1+/irtXZinn366DEm96corryzfF5Tf47YoVRnHXW1vFcbxZ599Vs7P/6J8TMvTEqo4jiPIVxzMS1cvwZ5DzRZbbFGOmwX/Fn1Vd/qI9pZYYolyvORjXb7qY5Yfr/l2foIKXVUURTr66KPTjBkzykv450vPN5x6nzKqigWnoh1wwAHFpEmT2m5PmTKluOuuu4rXXnutePLJJ4v99tuvGDRoUPH888/3SvuOP/744r777iveeOON4qGHHip22WWXYvnlly+veLGw9uZtBgwYUJxzzjnl6f98lbI8refZZ5+tZHvr3b/ZY489VvbZGWecUbzyyivFddddVyy55JLFtdde27ZNbnNue6vXX3+93CZPGcj9nKdJ9e/fv7jzzjsr2d7f/OY3xS233FJun8dCHvOLLbZYcc899xS9JV/tZ/XVVy+nriyoauO4u+2twjgeP358scoqqxS33357+fi7+eaby8devvJZFcdxX5Knn6299trFzjvvXH79j3/8o23h/7355pvFU089VT5evvGNb5Rf5yVfqbRR3XDDDcXAgQPLKaMvvPBCceihhxZLL7108d5779W7aZWRx0frWMlPX88999zy6zye+J8jjjiinN6Zn3998fjTSFOKBZsOgk2+nZ8gtJo4cWL55GaJJZYoVlpppWL33XcvZs2a1Wvty5deHT58eLn//KQl33711Vc7bG920003Feuuu255n3wp1zxnvqrtrXf/tvrjH/9YjB49uiww6623XnHZZZe1+35uc277gpdQ3nTTTcu2r7nmmuW88aq296yzzirn/ecn2/l9FzvuuGPx5z//uehN+Yl/LkovvfTSl75XtXHc3fZWYRw3NzeXx7Lcjvx3zmPyF7/4RdHS0lLZcdxX5D7r6P0lFO3G38L6KI/BRnbBBRe0HT/ye2seffTRejepUlo/rmDBZcGa0chSB8efRjqe98v/1PusEQAAwNfRGJN/AQCAPk2wAQAAwhNsAACA8AQbAAAgPMEGAAAIT7ABAADCE2wAAIDwBBsAACA8wQYAAAhPsAEAAMITbAAAgBTd/wFInBAVoDI5LwAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": "print(x.shape)",
   "id": "349e6fc93d4063a9"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:50:55.972630Z",
     "start_time": "2025-06-21T10:50:55.604934Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# PCA analysis\n",
    "from sklearn.decomposition import PCA\n",
    "pca = PCA(n_components=4)\n",
    "x_pca = pca.fit_transform(x_norm)\n",
    "# calculate the variance ratio of each principle components\n",
    "var_ratio = pca.explained_variance_ratio_\n",
    "print(var_ratio)"
   ],
   "id": "33ddf85e85edaeab",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.72770452 0.23030523 0.03683832 0.00515193]\n"
     ]
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:52:31.530203Z",
     "start_time": "2025-06-21T10:52:29.888835Z"
    }
   },
   "cell_type": "code",
   "source": [
    "fig2 = plt.figure(figsize=(10,5))\n",
    "plt.bar([1,2,3,4],var_ratio)\n",
    "plt.xticks([1,2,3,4], ['PC1','PC2','PC3','PC4'])\n",
    "plt.ylabel('Variance Ratio of each PC')\n",
    "plt.show()"
   ],
   "id": "b2eacc10696be084",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ],
      "image/png": "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PvnkeOmll7LrdnrhhReyQLW70AQAAFD0U/VSK/K77747fvjDH8bixYvjK1/5SmzZsqWiy97QoUOzqXY7pddTV72RI0dmgSl14EvNIVKzCAAAgFrZjjytUVq/fn2MHTs2m27Xo0ePmDVrVkXDiBUrVmSd9nZKjR1+97vfxRVXXBHdu3fP9nFKIeqqq64q4E8BAADUdiXl5eXlUYekduSpu15qFNGyZcvYH5SOnlnoEqhFlk0cVOgSAABqXTYoqq56AAAAhSA4AQAA5BCcAAAAcghOAAAAOQQnAACAHIITAABADsEJAAAgh+AEAACQQ3ACAADIITgBAADkEJwAAAByCE4AAAA5BCcAAIAcghMAAEAOwQkAACCH4AQAAFBdwWnhwoXxiU98IjZt2rTLaxs3bsxee+aZZ/b24wAAAGpfcJo0aVKcfvrp0bJly11ea9WqVfTv3z9uueWW6q4PAACgeILTn/70p/jUpz61x9fPOeecmDdvXnXVBQAAUHzBadWqVdGiRYs9vt68efNYs2ZNddUFAABQfMHpIx/5SCxdunSPry9ZsiTatm1bXXUBAAAUX3Dq169f3HDDDbt9rby8PHstXQMAAFDbNNjbC6+55pro2bNn9OnTJ6688so4+uijK0aaUuOIF154Ie69996arBUAAGD/Dk5HHHFEzJkzJ77whS/E+eefHyUlJRWjTV27do1HHnkkjjzyyJqsFQAAYP8OTkmvXr3iueeei6effjpefPHFLDQdddRR0aNHj5qrEAAAoJiCU9r8NrUl3759e5x22mlZwwgAAIDabq+DUxplOuuss2Lt2rXZ89Sa/Cc/+UkMHDiwJusDAAAonq56V111VRx++OHxhz/8IRYuXBhnnHFGXHbZZTVbHQAAQDGNOKWwNHv27DjxxBOz59OnT482bdpk0/datmxZkzUCAAAUx4jT66+/HoccckjF89atW0ezZs3iH//4R03VBgAAUHzNIf72t79VrHFKUle9xYsXx+bNmyvOde/evXorBAAAKKbglNY1pbD0bmeffXa2p1M6n76WlZVVd40AAADFEZz+/ve/12wlAAAAxR6cDjvssJqtBAAAoNibQwAAANRVghMAAEAOwQkAACCH4AQAAJBDcAIAAKju4LRu3bq4+OKLo2PHjtGgQYOoX79+pQMAAKBOb4CbfOELX4gVK1bEtddeGwcffHC26e2HNXXq1Ljlllti7dq1cfzxx8ftt98evXv33u219957bwwfPrzSucaNG8dbb731oesAAAColuD05JNPxhNPPBE9evSI6jBjxowYNWpUTJs2Lfr06RNTpkyJgQMHxtKlS6Ndu3a7fU/Lli2z13eqjvAGAABQbVP1OnfuHOXl5VFdJk+eHCNGjMhGkbp27ZoFqKZNm8b06dP3+J4UlDp06FBxtG/ffo/Xbtu2LTZt2lTpAAAAqNHglEaERo8eHcuWLYsPa/v27bFw4cLo16/fvwqqVy97Pn/+/D2+780334zDDjssC3Gf+tSn4vnnn9/jtRMmTIhWrVpVHOk9AAAA1T5V78ADD6w0HW7Lli1xxBFHZCNDDRs2rHTt66+/vtfffMOGDVFWVrbLiFF6vmTJkt2+5+ijj85Go7p37x4bN26MW2+9Nf793/89C0+HHHLILtePGTMmmwq4UxpxEp4AAIBqD05plGl/0bdv3+zYKYWmY489Nu68884YP378LtenxhHpAAAAqNHgNGzYsKgJbdu2zVqYpxbn75aep7VLeyONeJ1wwgnx0ksv1UiNAAAAVV7j9PDDD8fvfve7Xc7Pnj07fvvb31bpsxo1ahQ9e/aMuXPnVpzbsWNH9vzdo0rvJ031e/bZZ7PW6AAAAPtFcEqNIVJYea8UeNJrVZXWH919993xwx/+MBYvXhxf+cpXsjVUO/dqGjp0aLZOaafrr78+C2mvvPJKLFq0KC666KJYvnx5XHrppVX+3gAAADWyj9OLL76YtQ1/r2OOOeYDTZcbMmRIrF+/PsaOHZttgJv2h5o1a1ZFw4i02W7qtLfTP//5z6x9ebo2Na1II1bz5s3bbU0AAADVoaS8ipsypbVH999/f5x++umVzs+ZMycuvPDCeO2112J/lrrqpbbkqSNf2kh3f1A6emahS6AWWTZxUKFLAAAoClXJBlWeqpf2Tbr88svj5ZdfrjiXRpquvPLKOPfccz9YxQAAAPuxKgenm2++OZo1a5ZNzTv88MOzI7UDP+igg7I9lQAAAKKur3FKQ1lpTdEjjzwSzzzzTBxwwAHZZrSnnHJKzVQIAABQbMEpKSkpiQEDBmQHAABAbfeBglNqF/74449nHe+2b99e6bWvf/3r1VUbAABAcQanv/zlL3HWWWfF1q1bswDVpk2b2LBhQzRt2jTatWsnOAEAALVOlZtDXHHFFXHOOedk+yml9U1//OMfsw1o035KmkMAAAC1UZWD09NPP521Hk+b0tavXz+2bdsWnTt3zrrtfetb36qZKgEAAIopODVs2DALTUmampfWOe3strdy5crqrxAAAKDY1jidcMIJ8dRTT0WXLl3i1FNPjbFjx2ZrnH70ox9Ft27daqZKAACAYhpxuvHGG+Pggw/OHt9www1x4IEHxle+8pVYv3593HXXXTVRIwAAQHGNOPXq1avicZqqN2vWrOquCQAAoLhHnJJ33nkn5syZE3feeWds3rw5O7d69ep48803q7s+AACA4htxSq3HzzzzzKwpROqo179//2jRokXcdNNN2fNp06bVTKUAAADFMuI0cuTIbLrezn2cdjrvvPNi7ty51V0fAABA8Y04PfHEEzFv3rxo1KhRpfOlpaWxatWq6qwNAACgOEecduzYEWVlZbucf/XVV7MpewAAAFHXg9OAAQNiypQpFc9LSkqyphDjxo2Ls846q7rrAwAAKL6pepMmTYqBAwdG165d46233ooLL7wwXnzxxWjbtm38z//8T81UCQAAUEzB6ZBDDolnnnkmZsyYkX1No02XXHJJfP7zn6/ULAIAAKDOBqfsTQ0aZEEpHQAAALXdB9oAFwAAoC4RnAAAAHIITgAAANURnL773e9mHfSSFStWRHl5+d68DQAAoO4Ep1GjRsWmTZuyx4cffnisX7++pusCAAAorq56HTt2jJ///OfZBrdptOnVV1+tGIF6r0MPPbS6awQAANj/g9M111wTX/va1+Kyyy6LkpKSOOmkk3a5JgWq9FpZWVlN1AkAALB/B6cvfelLccEFF8Ty5cuje/fuMWfOnDjooINqvjoAAIBi2gC3RYsW0a1bt/jBD34QJ598cjRu3LhmKwMAACi24LTTsGHDsq8LFy6MxYsXZ4+7du0aJ554YvVXBwAAUIzB6bXXXovzzz8/HnvssWjdunV27o033ohPfOIT8cADD8RHPvKRmqgTAACgeDbATU0iNm/eHM8//3y8/vrr2fHcc89l7cq//vWv10yVAAAAxTTiNGvWrKw5xLHHHltxLk3Vmzp1agwYMKC66wMAACi+EacdO3ZEw4YNdzmfzqXXAAAAoq4Hp9NPPz1GjhwZq1evrji3atWquOKKK+KMM86o7voAAACKLzjdcccd2Xqm0tLSOOKII7Lj8MMPz87dfvvtNVMlAABAMa1x6ty5cyxatChb57RkyZLsXFrv1K9fv5qoDwAAoPiCU1JSUhL9+/fPDgAAgNquylP1akLqyJem/jVp0iT69OkTCxYs2Kv3pX2jUogbPHhwjdcIAADUXQUPTjNmzIhRo0bFuHHjsimAxx9/fAwcODDbaPf9LFu2LL7xjW/Exz/+8X1WKwAAUDcVPDhNnjw5RowYEcOHD8/2g5o2bVo0bdo0pk+fvsf3lJWVxec///n49re/HR/96Ef3ab0AAEDdU9DgtH379li4cGGlxhL16tXLns+fP3+P77v++uujXbt2cckll+R+j23btmUd/959AAAA1HhziDTi88tf/jIWL16cPf/Yxz4W5557btSvX79Kn7Nhw4bss9q3b1/pfHq+s2Pfez355JNxzz33xNNPP71X32PChAnZyBQAAMA+G3F66aWXsil1Q4cOjQcffDA7Lrrooiw8vfzyy1GTNm/eHBdffHHcfffd0bZt2716z5gxY2Ljxo0Vx8qVK2u0RgAAoPap8ojT17/+9WxdUZpK16ZNm+zcP/7xjyw8pddmzpy515+Vwk8apVq3bl2l8+l5hw4ddrk+BbPUFOKcc86pOLdjx47/+0EaNIilS5dmG/K+W+PGjbMDAABgnwWnxx9/PP74xz9WhKbkoIMOiokTJ8bJJ59cpc9q1KhR9OzZM+bOnVvRUjwFofT8sssu2+X6Y445Jp599tlK56655ppsJOq2227LNucFAAAoeHBKozcpqLzXm2++mQWhqkqtyIcNGxa9evWK3r17x5QpU2LLli1Zl70kTQns1KlTtlYp7fPUrVu3Su9v3bp19vW95wEAAAoWnM4+++z40pe+lDVoSEEn+dOf/hRf/vKXswYRVTVkyJBYv359jB07NtauXRs9evSIWbNmVTSMWLFiRdZpDwAAoFBKysvLy6vyhjfeeCMbIfr1r38dDRs2zM698847WWi69957o1WrVrE/S+3IU42pUUTLli1jf1A6eu/XhUGeZRMHFboEAICiUJVsUOURpzQ17le/+lW8+OKLFS3Djz322DjyyCM/eMUAAAC1bR+npEuXLtkBAABQ2zXY2wYO48ePj2bNmmWP38/kyZOrqzYAAIDiCU5/+ctf4u233654DAAAUJfsVXB69NFHd/sYAACgLqhyn+8vfvGLu93HKe29lF4DAACIuh6cfvjDH8b/+3//b5fz6dx///d/V1ddAAAAxddVL/U4T1s+pSONODVp0qTitbKysnj44YejXbt2NVUnAADA/h+c0v5NJSUl2XHUUUft8no6/+1vf7u66wMAACie4JSaQqTRptNPPz1+/vOfR5s2bSpea9SoURx22GHRsWPHmqoTAABg/w9Op556avb173//e3Tu3Dnq1avy8igAAIDaHZx2SiNLydatW2PFihWxffv2Sq937969+qoDAAAoxuC0fv36GD58ePz2t7/d7eupUQQAAEBtUuX5dpdffnm88cYb8ac//SkOOOCAmDVrVtaivEuXLvHQQw/VTJUAAADFNOL0+9//Pn71q19Fr169snVOaepe//79o2XLljFhwoQYNGhQzVQKAABQLCNOW7Zsqdiv6cADD8ym7iXHHXdcLFq0qPorBAAAKLbgdPTRR8fSpUuzx8cff3zceeedsWrVqpg2bVocfPDBNVEjAABAcU3VGzlyZKxZsyZ7PG7cuDjzzDPjvvvuy/Zyuvfee2uiRgAAgOIKThdddFHF4549e8by5ctjyZIlceihh0bbtm2ruz4AAICC+9C72DZt2jROPPHEaN68edx6663VUxUAAECxBqfUCOI3v/lNzJ49u2K/prfffjtuu+22KC0tjYkTJ9ZUnQAAAPv/VL0nn3wyzj777Ni0aVOUlJRk7ch/8IMfxODBg6NBgwZx3XXXxbBhw2q2WgAAgP15xOmaa66Js846K/7617/GqFGj4qmnnorzzjsvbrzxxvjb3/4WX/7yl7MNcQEAAOpscHr22Wez8NStW7e4/vrrs1Gnm2++OT7zmc/UbIUAAADFEpz++c9/VnTNSyNLqSlEClEAAAC1XZXakacpeWvXrs0el5eXZxvhbtmypdI13bt3r94KAQAAiik4nXHGGVlg2ik1i0jStL10Pn3d2W0PAACgzgWnv//97zVbCQAAQLEHp8MOO6xmKwEAAKgNG+ACAADURYITAABADsEJAAAgh+AEAABQE8HpnXfeiTlz5sSdd94Zmzdvzs6tXr063nzzzQ/ycQAAALVnH6dk+fLlceaZZ8aKFSti27Zt0b9//2jRokXcdNNN2fNp06bVTKUAAADFMuI0cuTI6NWrV/zzn/+MAw44oOL8eeedF3Pnzq3u+gAAAIpvxOmJJ56IefPmRaNGjSqdLy0tjVWrVlVnbQAAAMU54rRjx44oKyvb5fyrr76aTdkDAACIuh6cBgwYEFOmTKl4XlJSkjWFGDduXJx11lnVXR8AAEDxBadJkybFH/7wh+jatWu89dZbceGFF1ZM00sNIj6IqVOnZp/RpEmT6NOnTyxYsGCP1z744IPZGqvWrVtHs2bNokePHvGjH/3oA31fAACAGlnjdMghh8QzzzwTM2bMyL6m0aZLLrkkPv/5z1dqFrG30ueMGjUq68aXQlMazRo4cGAsXbo02rVrt8v1bdq0iauvvjqOOeaYbJ3Vb37zmxg+fHh2bXofAABAdSspLy8vjwJKYemkk06KO+64o2INVefOneNrX/tajB49eq8+48QTT4xBgwbF+PHjc6/dtGlTtGrVKjZu3BgtW7aM/UHp6JmFLoFaZNnEQYUuAQCgKFQlG1R5qt6ECRNi+vTpu5xP56o6VW/79u2xcOHC6Nev378Kqlcvez5//vzc96fMl1qgp9GpU045ZbfXpL2l0n+Qdx8AAABVUeXgdOedd2bT5N7rYx/7WJU3v92wYUPWoa99+/aVzqfna9eu3eP7UiJs3rx5NlUvjTTdfvvt2Ua8ewp6KUXuPNJoFgAAQI0GpxRoDj744F3Of+QjH4k1a9bEvpDanj/99NPx1FNPxQ033JCtkXrsscd2e+2YMWOyoLXzWLly5T6pEQAAqMPNIdKITeqqd/jhh1c6n8517NixSp/Vtm3bqF+/fqxbt67S+fS8Q4cOe3xfms535JFHZo9TV73FixdnI0unnXbaLtc2btw4OwAAAPbZiNOIESPi8ssvjx/84AexfPny7Ejrm6644orstapIU+169uyZrVPaKTWHSM/79u2715+T3pPWMgEAAOwXI07f/OY34x//+Ed89atfzZo7JGn/pauuuiqbFldVaZrdsGHDsr2ZevfunbUj37JlS9ZiPBk6dGh06tQpG1FK0td07RFHHJGFpYcffjjbx+l73/telb83AABAjQSnkpKSrHvetddem02RS3s3denS5QNPhxsyZEisX78+xo4dm62fSlPvZs2aVdEwYsWKFdnUvJ1SqEqh7dVXX82+d2pU8eMf/zj7HAAAgFq5j9O+Zh8najv7OAEAVH82qPKIUxrxmThxYrYO6bXXXsvWF73bK6+8UtWPBAAA2K9VOThdeuml8fjjj8fFF1+ctSVPU/cAAABqsyoHp9/+9rcxc+bMOPnkk2umIgAAgGJvR37ggQdGmzZtaqYaAACA2hCcxo8fn3XA27p1a81UBAAAUOxT9SZNmhQvv/xy1i68tLQ0GjZsWOn1RYsWVWd9AAAAxRecBg8eXDOVAAAA1JbgNG7cuJqpBAAAoLascQIAAKhrqjziVFZWFt/5znfiJz/5SaxYsSK2b99e6fXXX3+9OusDAAAovhGnb3/72zF58uQYMmRIbNy4MUaNGhX/8R//EfXq1YvrrruuZqoEAAAopuB03333xd133x1XXnllNGjQIC644IL4/ve/n7Uo/+Mf/1gzVQIAABRTcFq7dm0cd9xx2ePmzZtno07J2WefHTNnzqz+CgEAAIotOB1yyCGxZs2a7PERRxwRs2fPzh4/9dRT0bhx4+qvEAAAoNiC03nnnRdz587NHn/ta1+La6+9Nrp06RJDhw6NL37xizVRIwAAQHF11Zs4cWLF49Qg4tBDD4358+dn4emcc86p7voAAACKLzi9V9++fbMDAACgTgenhx56KD75yU9Gw4YNs8fv59xzz62u2gAAAIonOA0ePDjrpteuXbvs8Z6UlJRkG+QCAADUueC0Y8eO3T4GAACoC6rUVe/tt9+OM844I1588cWaqwgAAGA/U6XglNY4/fWvf625agAAAGrDPk4XXXRR3HPPPTVTDQAAQG1oR/7OO+/E9OnTY86cOdGzZ89o1qxZpdcnT55cnfUBAAAUX3B67rnn4sQTT8wev/DCC7t01QMAAIi6HpweffTRmqkEAACgtqxxAgAAqGuqPOKU/PnPf46f/OQnsWLFiti+fXul1x588MHqqg0AAKA4g9MDDzwQQ4cOjYEDB8bs2bNjwIAB2VqndevWxXnnnVczVQJFrXT0zEKXQC2ybOKgQpcAQB1U5al6N954Y3znO9+JX//619GoUaO47bbbYsmSJfG5z30uDj300JqpEgAAoJiC08svvxyDBv3fX/tScNqyZUvWTe+KK66Iu+66qyZqBAAAKK7gdOCBB8bmzZuzx506dcrakydvvPFGbN26tforBAAAKLY1Tqeccko88sgjcdxxx8VnP/vZGDlyZPz+97/Pzp1xxhk1UyUAAEAxBKc0stStW7e444474q233srOXX311dGwYcOYN29efPrTn45rrrmmJmsFAADYv4NT9+7d46STTopL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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:53:25.620604Z",
     "start_time": "2025-06-21T10:53:25.612278Z"
    }
   },
   "cell_type": "code",
   "source": [
    "pca = PCA(n_components=2)\n",
    "x_pca = pca.fit_transform(x_norm)\n",
    "x_pca.shape"
   ],
   "id": "e3818c9c8384800b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150, 2)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T10:54:07.232402Z",
     "start_time": "2025-06-21T10:54:07.225349Z"
    }
   },
   "cell_type": "code",
   "source": "print(type(x_pca))",
   "id": "792e23f84b14532",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'>\n"
     ]
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T11:14:14.805858Z",
     "start_time": "2025-06-21T11:14:14.473008Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# visualize the pca result\n",
    "fig3 = plt.figure(figsize=(10,5))\n",
    "Setosa = plt.scatter(x_pca[:,0][y==0],x_pca[:,1][y==0])\n",
    "Versicolor = plt.scatter(x_pca[:,0][y==1],x_pca[:,1][y==1])\n",
    "Virginica = plt.scatter(x_pca[:,0][y==2],x_pca[:,1][y==2])\n",
    "plt.legend((Setosa,Versicolor,Virginica),('Setosa','Versicolor','Virginica'))\n",
    "plt.show()"
   ],
   "id": "e44ed178d4376df5",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAAGsCAYAAAD+JmnAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWHRJREFUeJzt3Ql4VeW1//GVhDFKgiAhgIiAtopjUVCcChYLdW6d6nUA8a9eq7aItQmt4+21BvVBbfVqays4VKuVOlNQHLFqSaVYEIeqqAiEoGiCRIYm5/+s97Djyck+895nT99Pnzzp2XsnZycROL+sd623JBaLxQQAAAAAQqLU6xsAAAAAACcRcgAAAACECiEHAAAAQKgQcgAAAACECiEHAAAAQKgQcgAAAACECiEHAAAAQKh0ER9ra2uT1atXS69evaSkpMTr2wEAAADgEd3ec8OGDTJw4EApLS0NbsjRgDN48GCvbwMAAACAT6xcuVJ22mmn4IYcreBYX0hFRYXXtwMAAADAI83NzaYAYmWEwIYca4maBhxCDgAAAICSLNpYGDwAAAAAIFQIOQAAAABChZADAAAAIFR83ZMDAAAAZNLa2ipbt271+jZQoK5du0pZWZk4gZADAACAwO6b0tDQIF988YXXtwKH9O7dW6qrqwveI5OQAwAAgECyAk5VVZWUl5ezeXzAA2tLS4s0NjaaxwMGDCjo8xFyAAAAEMglalbA6du3r9e3Awf07NnTvNegoz/XQpauMXgAAAAAgWP14GgFB+FRvu3nWWiPFSEHAAAAgcUStXApcejnScgBAAAAECr05MBWa1tMFq1YL40bNklVrx4yemgfKSvlNyUAAADwP0IOOpm3bI1c88RyWdO0qf3YgMoectWxI2TiXoVNugAAAADcxnI1dAo4F9y3uEPAUQ1Nm8xxPQ8AABC2FSyvvv+ZPLZklXmvj922bt06ueCCC2TnnXeW7t27m71hJkyYIH/729+y+virr75a9ttvP9fvM6io5KCd/oHWCo7dH2s9povV9PyRI6pZugYAAELBqxUsJ554omzZskXuvvtuGTZsmKxdu1aeffZZ+eyzz1x7ziihkoN22oOTXMFJDjp6Xq8DAAAIOq9WsOj+PgsXLpQZM2bIuHHjZMiQITJ69GiZPn26HHfcce3X/L//9/+kX79+UlFRIUcccYS88cYb5tzs2bPlmmuuMY91Gpm+6TH18ccfy/HHHy/bb7+9+bhTTjnFBCiLfow+Z69evcz5/fffX/7xj3+YcxqwTjvtNBk0aJAZ5bz33nvLAw88IEFEyEE7HTLg5HUAAABBXcGi9LwbS9c0gOjbo48+Kps3b7a95uSTTzabYv71r3+V119/XUaOHCnf+c53ZP369XLqqafKpZdeKnvuuaesWbPGvOmxtrY2E3DWr18vL774ojzzzDPywQcfmHOW008/XXbaaSepr683n7e2tla6du1qzm3atMmEnqeeekqWLVsm5513npx55pmyaNEiCRqWq6GdTlFz8joAABA9rW2tsrhxsaxrWSf9yvvJyKqRUlaa/871fljBMmZ4X0efu0uXLqbycu6558odd9xhAsy3v/1t+eEPfyj77LOPvPzyyyZYaMjRfh114403mlD08MMPm/ChIUk/j/byWDTULF26VFasWCGDBw82x+655x4ThjTUjBo1ylR6LrvsMtl9993N+d12263947WC89Of/rT98cUXXyzz58+Xhx56yFSagoSQg3Y6JlrXoGqJ1u53FtqFU10ZHycNAACQbMFHC6RuUZ2sbfl6eVT/8v5SO7pWxg8ZL37i9QoW7ck5+uijzbK11157zVRsrr/+evn9738vGzdulC+//FL69u0Yrr766it5//33U37Ot956y4SbwdsCjhoxYoT07t3bnNOQM23aNLMM7t5775Xx48ebitHw4cPNta2trfKrX/3KhJpVq1aZniGtNOnStaBhuRra6TABbbJTyWMFrMd6nqEDAADALuBMe2Fah4CjGlsazXE97yd+WMHSo0cPOfLII+WKK66QV155RSZPnixXXXWVCTgDBgyQJUuWdHh75513TBWmEFdffbW8+eabJmA999xzJgQ98sgj5twNN9wgt9xyi9TU1Mjzzz9vnlMnvmnYCRpCDjrQKSK3nzHSVGwS6WM9zj45AADAbomaVnBiNmtBrGMzFs0w1/ltBUuqX93q8QFFXsGigUOrOLp8raGhwSxH23XXXTu87bjjjubabt26mcpLoj322ENWrlxp3izLly83Qwz0c1u+8Y1vyCWXXCJPP/20/OAHP5BZs2aZ4zq+Wnt6zjjjDNl3333N1Ld3331XgojlauhEg4yOidY1qFqi1d9g6B9wKjgAAMCO9uAkV3CSg05DS4O5blT1KPHTChadoqavcGJFXMGiU8x0mdiUKVNMD45OOtMJZ7pcTUOGLiMbM2aMnHDCCeaYhpLVq1ebgQDf//735YADDpBddtnF9N5otUUHCejn0I/TiWinn3663HzzzfKf//xHfvSjH5l+H/0YXe6mlaCTTjpJhg4dKp988onp1dGlc1Z/jvb8aFVphx12kJkzZ5rJbIkBKSgIObClf6CdbrIDAADhpEMGCr3Oi4EF1gqW5H1yql3eJ0eHBhx44IFy0003mR6brVu3mj4aHUTw85//3IyEnjt3rvziF7+Qs88+22wcqgMGDj/8cOnfv7/5HBpM/vKXv5hx0Fqp0WqMLnd77LHHzMAAvba0tFQmTpwov/nNb8zHlJWVmYB11llnmfCiVSGt5Og4anX55ZebaWy6RE37cHTAgQatpqYmCZqSWCzm/paueWpubpbKykrzjdU53gAAAPCf+oZ6mTJ/Ssbr7ppwl20lJ5+BBTruWCsZWpHQ3pZC6JhoVrD4Q7qfay7ZgJ4cAAAAFESrLhpKSlJ0uOjx6vJqc50fBxZYK1iO32+QeU/ACT5CDgAAAAqiy8q06qKSg471uGZ0TaflZ0EcWIBgIOQAAACgYLqsbObYmVJVXtXhuFZ49LjdsrNcBhYAuWDwAAAAAByhQWbc4HFZDxBwYmABYIeQAwAAAMdooMl2TLSGICevAywsVwMAAEDgBhYA6RByAAAAEKiBBUAmhBwAAAAEamABkAk9OQAAAAjUwALkrqSkRB555BE54YQTfPn5nEbIAQAAQKAGFgTZscceK1u3bpV58+Z1Ordw4UI5/PDD5Y033pB99tnH0edds2aN7LDDDhIVLFcDAABAtOlmoysWiix9OP7exc1HzznnHHnmmWfkk08+6XRu1qxZcsABB+QccLZs2ZLxmurqaunevbv4RTb3XAhCDgAAAKJr+eMiN+8lcvcxInPOib/Xx3rcBcccc4z069dPZs+e3eH4l19+KX/+859NCHr55ZflsMMOk549e8rgwYPlxz/+sWzcuLH92l122UV++ctfyllnnSUVFRVy3nnnmdBw0UUXyYABA6RHjx4yZMgQue666zosL3v00UfbH2vIOu2006RPnz6y3XbbmXD197//vf387bffLsOHD5du3brJN7/5Tbn33nvTfl1Lly6VI444wtxz3759zT3p12SZPHmyWdp27bXXysCBA83ndBMhBwAAANGkQeahs0SaV3c83rwmftyFoNOlSxcTTjTkxGKx9uMacFpbW2XMmDEyceJEOfHEE+Vf//qXPPjggyb0aIBJdOONN8q+++4r//znP+WKK66QX//61/L444/LQw89JO+884788Y9/NGHIjoaPb3/727Jq1SrzMbo87mc/+5m0tbWZ89pr85Of/EQuvfRSWbZsmZx//vly9tlny/PPP2/7+TSATZgwwSyHq6+vN1/LggULOt3zs88+a+5NK1lPPvmkuKkklvjd9Znm5maprKyUpqYmk1IBAAAAtWnTJlmxYoUMHTrUVC5ypkvStGKTHHDalYhUDBSZulTE4QEIb7/9tuyxxx4mNIwdO9Yc014crb7okrKysjL57W9/2369hhwNJRom9GvV8PKtb33LhBGLVnvefPNNEy5KSkrSDgr43e9+Jz/96U/lww8/NJWcZIcccojsueee5jrLKaecYp7/qaee6vT57rzzTqmpqZGVK1eaqpCaO3eu6T9avXq19O/f31RytA/p448/NtWhfH6uuWQDKjkAAACIno9eSRNwVEykeVX8OoftvvvucvDBB8tdd91lHr/33ntm6IAuVdOqilZ5tt9++/Y3rZJolUVf/Ft0eVkiDRFLliwxy8B+/OMfy9NPP53y+fU6DUl2AUe99dZbJugk0sd6PNX1WlWyAo51vd6zVm4se++9d9qA4yRCDgAAAKLny7XOXpcjDTRz5syRDRs2mIED2v+i1RpdSqbLwzSIWG8afP7973+bayyJgUKNHDnShCDt1fnqq69M5eWkk06yfW7tm/FC8j27iZADAACA6Nm+v7PX5UhDSGlpqdx///1yzz33yJQpU8wSMA0ry5cvl1133bXTW6YqiC7hOvXUU83yMe3l0RC1fv36Ttfp9DYNT3bnlC6l+9vf/tbhmD4eMWJEyus1iCUOR9Dr9etze8BAKoQcAAAARM+Qg+M9N9p7k7InZ1D8OhfoMjQNJNOnTzd72OhyM6W9La+88opp2tcgohWcxx57rFMTf7KZM2fKAw88YPp93n33XdP8r2Oje/fu3elanaqm57SfRsPIBx98YALRq6++as5fdtllZsmcTljT59fP/Ze//MX08dg5/fTTTf/MpEmTzKAC7TW6+OKL5cwzzzT9OF4g5AAAACB6dJjAxBnbHiQHnW2PJ9Y5PnQgecna559/bnpudKyyVWV58cUXTVDRMdLaO3PllVe2n0+lV69ecv3115tenVGjRpmhAtr8r9WUZFoR0p6dqqoqOeqoo0yvTF1dnRl4oDT83HLLLWaCmw4g0CEIuqTOGpKQrLy8XObPn28qQ/rcukzuO9/5jtx6663iFaarAQAAIHrT1Sw6JnpeTcchBFrB0YAz4jhH7hXZc2q6WpccnhMAAAAIFw0yux8dn6KmQwa0B0eXqLlYwYH7CDkAAACINg00Qw/z+i7gIEJOwLW2xWTRivXSuGGTVPXqIaOH9pGy0lQNdAAAAED4EXICbN6yNXLNE8tlTdOm9mMDKnvIVceOkIl7DfD03gAAAACvMF0twAHngvsWdwg4qqFpkzmu5wEAAIAoIuQEdImaVnDsxuJZx/S8XgcAAABEDSEngLQHJ7mCk0ijjZ7X6wAAAICoIeQEkA4ZcPI6AAAAIEwIOQGkU9ScvA4AAAAIE0JOAOmYaJ2ilmpQtB7X83odAAAAguXqq6+W/fbbr+DP88ILL0hJSYl88cUXWX/M5MmT5YQTTpCgI+QEkO6Do2OiVXLQsR7refbLAQAA8Jdjjz1WJk6caHtu4cKFJpT84Ac/kGeffbbg5zr44INlzZo1UllZmfXH3HLLLTJ79mwJOkJOQOk+OLefMVKqKzsuSdPHepx9cgAAALLT2tYq9Q31MveDuea9PnbLOeecI88884x88sknnc7NmjVLDjjgANlnn32kb9++KT/Hli1bsnqubt26SXV1tQlO2dJA1Lt3bwk6Qk6AaZB5ueYIeeDcg+SWH+5n3utjAg4AAEB2Fny0QCbMmSBT5k+RmoU15r0+1uNuOOaYY6Rfv36dqiVffvml/PnPfzYhKHm5mrWE7Nprr5WBAwfKN7/5TXP8lVdeMdf16NHDhKNHH33UBJolS5bYLlfT59QAM3/+fNljjz1k++23N1UlrfYkP5elra1Nrr/+etl1112le/fusvPOO5v7sNTU1Mg3vvENKS8vl2HDhskVV1whW7duFa8RcgJOl6SNGd5Xjt9vkHnPEjUAAIDsaJCZ9sI0WduytsPxxpZGc9yNoNOlSxc566yzTOCIxb7e01ADTmtrq5x22mm2H6fL19555x1TBXryySelubnZLH3be++9ZfHixfLLX/7SBI5MWlpa5MYbb5R7771XXnrpJfn444/lpz/9acrrp0+fLnV1dSa8LF++XO6//37p379/+/levXqZr0XP6VK3O++8U2666SbxWhevbwAAAAAoNl2SVreoTmI226vrsRIpkRmLZsi4weOkrLTM0eeeMmWK3HDDDfLiiy/K2LFj25eqnXjiiSn7Z7bbbjv5/e9/b5agqTvuuMNUaTRUaCVnxIgRsmrVKjn33HPTPrdWWfRjhw8fbh5fdNFF8j//8z+2127YsMEEl1tvvVUmTZpkjunHHXrooe3XXH755e3/f5dddjGB6U9/+pP87Gc/k9BWcq677joZNWqUSXhVVVWm9KUJFAAAAPDS4sbFnSo4yUGnoaXBXOe03Xff3QwFuOuuu8zj9957zwwd0KVqqWjFxgo4Sl9Ta++OBhzL6NGjMz53eXl5e8BRAwYMkMbGRttr33rrLdm8ebN85zvfSfn5HnzwQTnkkENM748uf9PQo9Uhr7kacjSdXnjhhfLaa6+Z0pomx+9+97uyceNGN58WAAAASGtdyzpHr8uVBpo5c+aYaolWcTR4fPvb3055vVZynNC1a9cOj7UalLhsLlHPnj3Tfq5XX31VTj/9dDnqqKPMErp//vOf8otf/CLrwQiBDTnz5s0zzUt77rmn7Lvvvma9nia7119/3c2nBQAAANLqV97P0etydcopp0hpaanpcbnnnnvMErZcpqDp8IGlS5eaSoulvr7e0XvcbbfdTNBJNc5aBx8MGTLEBBsdfKDXf/TRR+IHRR080NTUZN736WO/SaX+kLSJKvENAAAAcNrIqpHSv7y/6b2xo8ery6vNdW7QpV2nnnqqaezX6WZaGMjFf/3Xf5nJZ+edd55ZVqYT03SggLn3EmcGUelSOB1moP01GsTef/99s0LrD3/4gzmvoUYLGNqDo+d+/etfyyOPPCKRCjn6Q5g6dapZs7fXXnul7OHRZivrbfDgwcW6PQAAAPh0bxk36DCB2tG15v8nBx3rcc3oGseHDiQvWfv8889lwoQJZjR0LioqKuSJJ54w46J1jLRWU6688kpzrkdCn06hdKrapZdeaj63jp3WYGb18Bx33HFyySWXmOEFeg9a2dHr/aAklmoRnsMuuOAC+etf/yovv/yy7LTTTikrOYklN63kaNDRCpD+IAEAAOA9Ha2sk8kSG/e1KqKhYfyQ8UW5h02bNsmKFStk6NChBb2ot/tatIKjAadYX4tT/vjHP8rZZ59tXjtn6qfxq3Q/V80GWgjJJhsUZYS0pjttRtJZ3KkCjtINhvQN/tbaFpNFK9ZL44ZNUtWrh4we2of9eQAAiNjeMsmjl629ZWaOnRmocKD3qmOidYqaDhnQHhxdouZmBccpuoRMN+AcNGiQvPHGG2Zpmfb69AxowHGSqyFHi0QXX3yxWZunO65qIkOwzVu2Rq55YrmsadrUfmxAZQ+56tgRMnGvAZ7eGwAACO/eMm7Sex1VPUqCpqGhwSwj0/c6Cvrkk0+Wa6+91uvbCn9Pjo6Pvu+++8zUCN0rR38A+vbVV1+5+bRwMeBccN/iDgFHNTRtMsf1PAAACC8v95ZBZzoQ4MMPP2xf4nXTTTeZfXDgcsi5/fbbzZo53clV06X1ppsGIXhL1LSCY9fAZR3T83odAAAIJ6/3lgF8s1wN4ehp0ftNruAk0p+0ntfrxgzvW9R7AwAA0dhbxg6vN8Ml5tDPsyiDBxD8nhYNZE5eBwAAgru3jA4ZsOvL0Z4cPe/W3jKJunbtat63tLTQaB8iLS0tHX6++SLkeNDTkvxXgtXTcvsZI30bdLTi5OR1AAAgeKy9ZXSKmgaaxKBTrL1l2u+lrEx69+7dvmeL9qI4tQkmvKngaMDRn6f+XPXnWwhCjk96WvSPpJ4/ckS1L5eu6ZI6rThpILP7GvSOqyvjS+8AAEB46chlHRNtt09OsfeWqa6uNu+toIPg6927d/vPtRCEnCIJek+LBi9dUqcVJw00iUHHimR63o8BDQAAhHNvGa3c6FCrqqoq2bp1a1GfG87TJWqFVnAshJwiCUNPiy6l0yV1yT1F1QHoKQIAAOHdW0ZfGDv14hjhQMgpkrD0tGiQ0SV1QZsOBwAAgOgg5BRJmHpaNND4cUkdAAAA4PpmoOjc06KSax70tAAAAADOIeR40NOiFZtE+tjP46MBAACAIGG5WpHR0wIAAAC4i5DjAXpaAAAAAPewXA0AAABAqBByAAAAAIQKIQcAAABAqBByAAAAAIQKIQcAAABAqBByAAAAAIQKIQcAAABAqBByAAAAAIQKm4EiJ61tMVm0Yr00btgkVb16yOihfczmpm5/LAAAAJAtQg6yNm/ZGrnmieWypmlT+7EBlT3kqmNHyMS9Brj2sQAAAEAuWK6GrGhIueC+xR1Cimpo2mSO63k3PhYAAADIFSEHWS0z0ypMzOacdUzP63VOfiwAAACQD0IOMtI+muQqTCKNJ3per3PyYwEAAIB8EHKQkQ4KyPe6Qj4WAAAAyAeDB5CRTkLL97pCPjYTprUBAADADiEHGWl40EloOijArnNGY0V1ZTxkOPmx6TCtDQAAAKmwXA0ZaXVEw4NKrpNYj/W8XRWlkI9NhWltAAAASIeQg6xodeT2M0aaqksifazH01VPCvnYZExrAwAAQCYsV0PWNIwcOaI6rz6YQj4232ltY4b3zelzAwAAIBwIOciJhpJ8w0MhH2thWhsAAAAyYbkaAsXNaW0AAAAIB0IOAsWa1pZqkZseH5DHtDYAAACEByEHgeLGtDYAAACECyEHgePktDYAAACED4MHEEhOTWsDAABA+BByEFhOTGsDAABA+LBcDQAAAECoEHIAAAAAhAohBwAAAECoEHIAAAAAhAohBwAAAECoMF0NjmptizHWGQAAAJ4i5EQscCi3Qsi8ZWvkmieWy5qmTe3HBlT2kKuOHcEGnQAAACgaQk5I2QWO3uVdzfsvWrY6HkL0+S64b7HEko43NG0yx28/YyRBBwAAAEVBT04IWYEjMeBY4SYx4CSGEP2YQipGGqiSA46yjul5vQ4AAABwGyEnZNIFDnEphOjyt+RAlfwcel6vAwAAANxGyAmZTIHDjRCi/T1OXgcAAAAUgp6ckCkkSOTzsVr9+XTD5qyu1UEHAAD4SWtbqyxuXCzrWtZJv/J+MrJqpJSVlnl9WwAKRMgJmUKCRK4fazfcwI7Obquu/Hq6GwAAfrDgowVSt6hO1rasbT/Wv7y/1I6ulfFDxnt6bwAKw3K1kNEgoRPTchkKrdcOyDGEpBpuYPe5lU5wY78cAICfAs60F6Z1CDiqsaXRHNfzQapG1TfUy9wP5pr3+hiIOio5IaNBQgOFBhCNFJlGCWQTQpL329l/yA5ZDzfQCg775AAA/ERDgFZwYjb/kumxEimRGYtmyLjB43y/dI1qFGCPkBNCGih0X5rkpWQ7lHc1f50njpHOFELslqT12a6brN+4JeN9XHH0HjL5kKFUcAAAvuqZ0c+XXMFJDjoNLQ3mulHVo4p2X/lWo5LDmlWNmjl2JkEHkUXICSkNLUeOqO5QgbGWoyUfSxVCUm3wmU3AUTv26k7AAQD4rkqhwaSQ67yqniQGq749+4amGgUELuS89NJLcsMNN8jrr78ua9askUceeUROOOEEN58SCTRgjBnet9Nxu2OF7rdjh2lqAAA/Vim08pLvdV5VT+yCVTrZVKOAMHN18MDGjRtl3333ldtuu83Np4FP9tspZJABAADZ9sworVLk22CvS8u08qLVDjt6vLq82lxXzPvKdUiCk1UrIGxcDTnf+9735H//93/l+9//vptPAx/tt8M0NQBAoXLpmcmHLt/SpWUqOehYj2tG13Ra5uX2fdlJF6ycrFoBYeOrEdKbN2+W5ubmDm/wRrZLzbbr3vEfAB1koEMPmKYGAPCqZyYbuqRMl5ZVlVd1OK4VnlRLzopxX8kyBatUUlWjgKjw1eCB6667Tq655hqvbwMJ++00NG1K+7ujjZtb5ZLx35BddizPOMgAAAC3e2ZyoUFGG/OznZJWrPsqNDClq0YBUeGrSs706dOlqamp/W3lypVe35JEfb+dTPSv0T/VfyzH7DPQDDQg4AAACpVvz0w+NARoY/5Rw44y79OFgmLeVyGBSatTP9rvR7KldQubgyKyfBVyunfvLhUVFR3e4B1dcjZ1/DfSXqNVHh1QoIMKAABwQr49M2G8r2yCVf+e/eXOI++UGYfNkAv3vVBisZjctuQ2qVlYI1PmT5EJcyaY4QVAlPgq5MB/dBmam4MKAABwqmcmaPelFRattMz9YG7Kiks2war2wFo5aOBB0q2sm/zfG/8njV812o63JuggSlztyfnyyy/lvffea3+8YsUKWbJkifTp00d23nlnN58aRR5AwJ44AAJBX0R+9IrIl2tFtu8vMuRgEXoWfPt9y7VnplicuK9cNhS1gpXd9Vo50vOZxluzOSiipiSmNU2XvPDCCzJu3LhOxydNmiSzZ8/O+PE6Xa2ystL057B0zRu6KeihM55LOYCgZNtEtZdrjqAfB4C/LX9cZF6NSPPqr49VDBSZOENkxHFe3pm/8X1zXKoNRa3KTKqKkAaZVMFKK0G6NC2TuybcxeagBUr3c4C7cskGrlZyxo4da9aFIvgDCC64b7H5qzfxp8meOAAC9UL9obOS/hbTfzHXxI+fcg8v2O3wfXNcIRUXa0iCHS/GW0dRLhU4eIueHGQ1gED3vtGKTSL2xAEQmKVWWomwrUdvOzavNn4dvsb3zRVubSjat2dfR69D6gpc8s+Pnid/8tU+OfAvDTJHjqg2U9R0yAB74gAIDO0lSVxq1UlMpHlV/LqhhxXxxnyO75sr3Kq4ZLtyhhU2+aHnKXgIOciaBhrdCwcAAkWb5Z28LiqDEPz8fQswtzYUXb9pvaPXoWP/zWurX8u6AkfPkz8QcgAA4abhwcnrotLQ79fvW8BZ+97oEie7qoDZ96a8f84biroVnqLMrv8mE3qe/IOeHABAuGl1RMNDis0UzfGKQfHrit3Qn7wczGro1/Ne8+P3LQTc2lA0m01Dq8urcw5PUZWq/yYTQqR/EHIAAOGmLxa1OmIkvwDc9nhiXfGWiQWlod9v37cQcWOjU7fCUxSl679JhRAZsX1yCsU+OQAAd5eHDYq/UC/m8rAVC0XuPibzdZOe9EdDv1++byHkxn4rdkus9MW3tWkoMst2z6Fs9zdCCPfJAQDAN/QF+e5He9/oH7SGfr9830Io3b43+dIX2Trhi80q85drX41W4AiR/kPIgSda22KMowZQfPpCz+vqSBAb+j36vkV1Z/lCv243wlOUZNtXc94+58lBAw6KzH+XQUPICSk/h4h5y9bINU8slzVNm9qPDajsIVcdO4KNRQGEn9XQr0MGbNf8a0P/wMg39BdzZ3mvwpTd8z6/8vmifd0obALej/b9EeHGx+jJCSE/hwi9twvuW9zprwwrft1+xkjP7xEAijZdzYh1/tvwlHsi3e9iTbZKfoHpRu9DMcNUpuet7FYpTVuaOl1Lz4d3/w2qxP8O+VkEJxswXS1krBCRGHBUQ9Mmc1zPe1ld0vCVZp6QOa/XAUCoaYDRIFOR9EsdreBEPOBk2lle6c7yep1bY4L1N/h6XM+7IdXz2gUcN75ueDMBD8XFcrUQyRQi9HcPev7IEdWeLF3T5XPJ4Sv5HvW8XjdmeN+i3hsAFB0N/bZ0+VYxdpbPFKb0N/YaKrSJ38klSfmMJ3by60b2GOIQbIScEPF7iND+ICevA4DA88MghGLQ6kOWYS7byVaF7ixfrDCV6/Pm+3VHdUiD2xjiEFyEnBDxe4jQAQhOXgcAUXnhH2i2++wMjG80arMsL9vJVoXuLF+sMOX057P7ur3qKwL8jJ6cEPF7iNAJbzoAIdVCOT2u5/U6AAg1feF/817xTUHnnBN/r4/1eBgHLCQGHKWT5fS4zddrTbayGrzd2lm+WGHKqc+X6uv2qq8I8DtCToj4PURoH5BOeLPuJfnelJ73y6hrAPDLC//AVqq0gpNu3My82vh1ScuDtAKhkoOO9Vg3Xix0KVaxwlSuz5vqXuy+7mIOaQCChpATIl6ECB128Or7n8ljS1aZ95kmo+l4aB0TXV3ZsZqkjxkfDSD08nzhH0i6FC85yHUQE2leFb/Og8lWxQpTuTxv4ijpbL7uXPqK8qUBqb6hXuZ+MNe8JzAhKOjJCRkrRCTvk1Ptwj45+e7Ho+d0wptfNysFAF+88A/6QALtNSrgumJMtrLClF0/iwYct/pZUj2vpXtZd7lw3wtl54qd037dbvcV0euDICPkhJDbIUKrNbc+957ctODdTues/XgyVWX0XhgTDSByCnzhH6hBCPo5CryuGJOtvBoTrM/bFmuTS1+8tNO5dV+tk/974/9MEEr39bvZV5RqQ1ar14e9YuB3hJyQyjdEaIBJF460enP1429KQ/Nm24/3w348AOBbDrzwdyWU5DgBLSt6P/o5tNfIdnleSfy8XhfBMcG67Ov6+uttz2W7T4/V36PBw64vRz+Hns+1r8irPYQAJxFyHHjhHxaZlp/pea3SZNq+zKn9eKLyfQcQIU698HcylFiDEJLvxxqEcMo9+QUdffGr92M+d0nS59/2d/nEunCOzS7SPj1Wf49WVjR4JIaSQvqKvNpDCHASIcelvpOgmfuv1fKj+/+ZcvnZbf/1LfnlU2/ltD9zIfvxROX7DiBinHjh72QoyTgIoSQ+CGH3o/MLI3ofej+2gawu/ypRCDjVT+NGX5FXewgBTiLkpJGqcpFt30lQzP3XGrnogc4BJ3H52eWPLZP1G7fm9Hnz3Y8nKt93ABFVyAt/p0NJMQYh6Nej9xOFjU9z4GQ/jdN9RV7tIQQ4iZCTZqmUVhJiIe870UDxo/vTj5bUrzeXgFOybZpbPvvxOPl9Z7kbAN/K94W/06GkWIMQ9OsK+rQ4hzndT+NkX5FbvT5AMRFyUtAXx4lLpdzqO/GSFSjckO9+PNl+32f/bYXs2Kt7yvDCcjcAvpfPC3+nQ4mTgxAcpI3vxZ52Vmxu9dOE/d6AbBFyCuwnKaTvxGuZAkWyPtt1k883bknbl1NokMj2+6n9Qamek+VuAELL6VDiwwloUdqbJVU/TUX3CjljjzPMEjS/3Vu6Xp8ohFMEByGnwH6SfPtO/CCXgKZB4oqjR8iF9y/u1CpruWT8bnLREbsVtCQsn+9nYnjRZWxRWGYIIATyGQHtdCjx2QS0KO7NYvXT3PmvO+Xet+6V5i3N0rS5SW5bcps8/O7Dnoa7XHp9ohROc0Hw8w4hJwVdAqUv7PUFdMzhvhO/yCVQWJWS20tHuroMLNP3XTKEl149uoZ+mSGAEMh3BLQbocQnE9CivDfLsx8/K7e9cVun434Id9n0+kQxnGaD4OetklgslstU4KJqbm6WyspKaWpqkoqKiqI/v7XsSez/GQn8siftyTl0xnNpA4UWO2497Vty1D4Di9bQn+r7no2Lxu0qtz7/XsbrbvnhfnL8foPyvEMAKECqEdDWvy7ZjIC2DUmDCgslTm4umof6hnqZMn9KxuvumnBXqPZmefrDp+Wyly6Ttlib7XmryX/eifN8Ge40nE6YMyHlvjp+v3+3pAp+Vk9TVINfMbNBacHPFmKmcnHGSFOxSaSPgx5wlAYTrcCoVBHl1tNGdgg41sdpFURDgr53etlXqu97dmKhX2YIIMAyjoDW3/TUxq9LR4PM1GUik54UOfEP8fdTlxZWdbEGIex9Uvx9kV+QRnFvFn0hfOmLl6YMOMkbb/pRLhuHRkWmqqTSqqReB/ewXC2LF9zavxHWUcRWoHBiCZqTFZ7k7/unGzZ3GDaQyphhO8qcxatCvcwQQIA5OQI6ZGOZo7Y3i/VCOFt+DXdRDKdOBr8wVSX9hpCTBatyEVZOBDk3RjYnft81QP3+5RUZw8tBw/ua59TlbilWq+c93hoAClasfWkCKOPeLLGY9O/eOzR7s2R6IRyUcBe1cJoNgp8/sFwNBS9Bs3pokhv+ralnet7NpXXJ4SXsywwBBJhP96XxA2tvFv31lAaaRNbjmpXvS9nbT0kY5PICt7q82rfhzgqnVq9JMj3u5/t3A8HPHwg5yJtWV/723qdSO2dputXlpsKj1xYql/Ci///lmiPkgXMPMkMG9L0+JuAA8JQ1AjplJ6SOgB5U1H1p/GT84HEyc0OrVLV27FXo39oqMxs/lfEtX2XXsxQAubzA9fPGm1+H06+b6qO+cSjBzx+Yroa82C1PS0dDhlNL/tye7gYAxZmuJvaLarOZrhZWKxaK3H2MaIRZ3KO7rCsrk36trTJy02bp8BJZBy0EvB8p01QyVVpSKjccfoN8d5fvShDHJesL+VQbh0ZluppKXH7JdLXiZQN6cpAza3laLM+NRwsNKWHvkQIQcj7Zl8aXtvUiaaAZtWlzxuuy3XjRjxsy6vMfNfQomfXmrJTXnLnHmYEIOLluHBoF+v3QIGO3T05Ug1+xEXKQVnIg2X/IDqaCk2v5zxrZ7MaAAgAIHA0yux9d2L40Hu9r47eepVQbL2qQmLtiru82ZNTgpfeVzvwP58sl+18SmKCQzcah6fgxjBaC4OctlqshJbtA0me7rrJ+49asP4c19Uz7YZ5Z3mBbAQrL5qoAUDS2m4FqJWhGsCtBGtxu3kukWQfWpJilqV+n7gmU8EIx1caLqfhhyVBUNz9NJVVI9TqMwl/YDBQFSzUxLdeAo6ypaKkqQE4PKACASPT0JO+3o8FAj+v5oNLgokEt3SxNXdKXEHDSbbyYih82ZGTMsHQKqcn9STpOXI/reSBXhBx0okEjnyVpyRKnnumSt3RDCvS59LxeBwBIQV+QawUn3a+Mgj59zOpZqkiq7GsFx2YoQ677zdhtyOgFxgxnDql+CKMILnpy0EmmQJJJ7/KucttpI83GnNZAgcTBA+lkex0ARJL24CRXcDqIiTSvil8X5OljOfQsFVrp8KpSknHzUykx58M+ZjhTSE0Mo1FYtgfnUMmBY0GjZNtb3Q/2lkN227HDxDRr8EAm2V4HAJGUYqpY3tf5mQYaDWp7nxR/n6JZu9BKh1eVEvaXiWPZHtxCyInocrRX3/9MHluyyrxP7oPJNmj02a5bxk05LTomWqeopdn+zpzX6wAAzk8fi+rGi6n4YUNGa8xwVXlVh+P69URlHxWW7cEtLFeLmGxGOFuBJNOStf85dk/p26t7Vvvd6HF9Dh1mUGK//Z05z6aeAJCGLtnS3pRM08f0uoiwKiLaoK7BJZsBBH6qlER9zDDL9uAWKjkRkmpiWkPTJnNczysNGlccvUfGz3ftX98yweb4/QaZzTkzBRQNUVrp0YpPthUgAEBh08eiIFVFRCs1Z+95tnmR7OdKibW/zFHDjjLvoxJwFMv24Bb2yYkIXZJ26IznUlZnEvez0bCiy9hOu/O1jJ/3gXMPMgGnkA1G01WAClXM5wIAb/fJGRQPOEHeJ6dAqTaTDNsmk1HZJ0dDqgYcv4RRBCsbsFwtInIZ4ayhxc1paBoycg1Gbi3NA4CwTx+LEqsiku1x+EfUl+3BeYScAMulSpFraAn6NDRraV5ymdJamsfyOAChmT4GhARhFE4i5ARUrlWKXEOLNXxAQ0EszfI2P05DS7eZaWzbvev5I0dUs3QNQKSxjAtAWDF4IMQDBAoZ4WxNQ7POJV/r52louSzNA4Ao90BMmDNBpsyfIjULa8x7fazHASDoCDkBk6lKofR88t43+YSWVNPQKnt2lanjdzOVED9ys58IAGy1tYqsWCiy9OH4e33s43vRIKMjl5N3mtcxvnqcoAMg6FiuFvIBAoms0JK8zK06zTI3PaZh5tbn3pNZf1shX3y11bzdtODf8qf6lb5s4g96PxGAMEw6Gxgf9VzsSWfLH5fWeTWyeMtnsq6sTPq1tsrIbn2lLOFedImaTrGy25NEj+nY3hmLZpgmcJauAQgqQk7AFFqlsEJLLmOVn1neIDcveDcwTfxB7icCEMCA89BZnTfm1M069fgp9xQv6Cx/XBY8eb7U9e0ta7t8vS9M///8R2qfPF/MEN4Rx5kenOQKTnLQaWhpMNfRBA5EW2uA+/aKslzttttuk1122UV69OghBx54oCxatKgYTxtKTlQprBHO2Wzime/yOC8FuZ8IQIDoMjCt4KT7G3JebXGWrrW1yoLnamVaVV9ZW9bxBYg+vqSqr1z/0nSpX/2arN2YOuAk0hc1AKJrQcD79lwPOQ8++KBMmzZNrrrqKlm8eLHsu+++MmHCBGlsbHT7qUMp1wECUW3iT9VPpI/9VnkCEFC6R03iErVOYiLNq+LXuaz1w5elrue2BWglSf9C6OOSErm3Z6lMeeZcub7++qw+p/7WFkA0LQhB357ry9Vmzpwp5557rpx99tnm8R133CFPPfWU3HXXXVJbW+v204eOVaXQZWIlSb8/dKNKEeQm/nyW5gFA1nQTTievK8DihnpZ2yW7f9K/2PxF2vPak9O/vL9ZluJ3QV5KA/hVa0j69lwNOVu2bJHXX39dpk+f3n6stLRUxo8fL6+++mqn6zdv3mzeLM3NzW7eXmDlM0Agqk381tI8AGiny8e0uqLhY/v+IkMOjm+smSv92Fyuc+p5bawry35hht0LF4u+eFE1o2t8/eJF6W+S9YVY4m+aNZzVjq6V8UNMBxKAPISlb8/VkPPpp59Ka2ur9O/f8R8Cffz22293uv66666Ta665xs1bCo1iVSlo4gcQKk5OQtOQoh+rQwZS/Q2p5/U6lyew9Rt8sMjbs3L+uB267yCfb/68Q0jQgONKSHAw5FlLaZIDm7WUZubYmQQdIE/Z9uP5vW/PV9PVtOKj/TuJlZzBgwd7ek9+VowqRbGXxwFAYCah6Qt0DSnmc6b4G3JincjbT7k+gW1k9Sjp37VCGrc0SSy5JyeNn436mfTfrr/7y70cDHlhWUoD+FW/LPvx/N635+rggR133FHKyspk7dqOJS99XF3deSPJ7t27S0VFRYc3eI8mfgCB59YkNH2BriGlIunvQX0Br8d3P7ooE9j0xXztIdeYAQMlseynXWrA0eUmRw07yrx3LeBomEse0mCFPD3v0lIaALnTX3ZoVddavppMj1eXV/u+b8/VSk63bt1k//33l2effVZOOOEEc6ytrc08vuiii9x8ajiMJn4AkZmENvSw3IOOhhm7pVgrFrr3vEl0edbMsTd16lPxdLhAxnBZEg95+v3LMmCFZSkN4Fdl+kuT0bVm6af+XZFYNQ1S357ry9V0+dmkSZPkgAMOkNGjR8vNN98sGzdubJ+2huCgiR9AYLk9CU3/sbcLKUWewKZBR5dpaRXj+Y+fl3vfutfbFykuhMuwLKUB/Gy8+aXJTNvhHq717QUt5Jx66qmybt06ufLKK6WhoUH2228/mTdvXqdhBAAAuCbXSWhONc879bw50OCiS8/0bWT/kd6+SHEh5FlLaXTIgF1fTpBGYAN+Nj7hlyZBHNNeEovlsHi3yHTwQGVlpTQ1NdGfAwBB4OKY5ILv6+a9Mk9Cm7o09f3m0zzvxPMGeS8ZXa539zGZr5v0ZE7L9azpasquSsV0NSCccskGhBxkrbUtRk8OgNRcHpNccLhqn64m9pPQ0k05SzWZLaePTX7ebU6+W2TPeN9q6LgY8uz2ydFmaL8tpckUMtnQFMgeIQeOm7dsTafNRwe4sPkogIAqJAQUM1zZXjsoPuo5YzUmVW9JnlWgTPcaFoWEywz8HhAybVjKhqZAbgg5cDzg6D45KV66MEYaiDonQkAxw1WuS+ryWXJl9xzLnxB5eJLNBxYhCHq97DCfcBlwqTYstZbUTd5zssx+c3bK8yy5AwrLBr7aDBT+XKKmFZw0wz/NeR0vzdI1IKJeurFoY5IdGU+cahKaU83zqSpLW79K8YH5jVIO1LLDdGO2QyjThqXq7uV3s6EpENTNQBF82oOTuEQtmf71rOf1OgARpC+IX/hVUcck5zWeuBC5TEhLufHlapGvPnf/Xn22cWcHVrjc+6T4+xC/eM+0Yalqi7WlPMeGpkDhCDlIS4cMOHkdgBBpr6RI0cckF3UPGq04aCUjxe7f8eV4g0QGH5imsiTeBEFHK2O6frk2fh2KshEpG5oC+SPkIC2doubkdQBCJGMlJYGGAA0L6eiLZ+1/Wfpw/H2mF9PF2oNGKw66VMtIDjrbHmtvycq/Z//9KFYQ9GNlLAKc2oiUDU2B/BFykJaOidYpaml+f2nO63UAIiaXqoOGgHTLk3QZlA4v0Ab/OefE3+vjdMujsq2wZApX2faU6GCAiqQhK/r81sCAgqowDt5rvtLcv8bN+h7dZe525VK/5u+m5wSZNyy1hgjYKS0pTXlej+s4bDY0BfJHyEGnQQOvvv+ZPLZklXmvdEx0mt9fmvMMHQAiKNuqw9ifp29Yz7cPJNsKi1O9H/o1TF0Wn6J24h/i73VinPW15V2FceFe85Hi/heU95QJgwfKlAH9paZqR5ny77tlwpwJZnoY7OmwAB0DrZKDTMm2/00aMSnleaX7/TB0AMgfI6RDLpcNPNPthaPYJwdAbhs9ikivgSKXLEv94t2tPWi8GE+czcaXPXcQ6dJdZMMab+81y/vXgDOtasf4o5IS2zHHOgHMz3vVeCnThqVB2dAU8Av2yUHOG3hmsxeOjonONjABiIhCN3rMZw+aYuzr4ub3w8+jlBPuv1VipoKztqysQ8BJDDqV3SulW2k3afyqsf04m1nmtmGp3zc0BfyEkBNxWr259bl/y00L/t3pnN0Gnnr9oTOeSzkqWj+murKHvFxzBKEGgLOVFB0yoD04mejyMB09HAR+qSwVeP/1Wz4zS9RyxWaWANzCZqARphWZqx9fLg3N9oHFbgPPXPbCGTO8r4t3DyCQCtnosVgT0oop6Btfbrv/dfW3iLw9K+cPZzNLAH5AyAmRVEvOMoUW9sIBUDBro8dcWRPS0vX1eD11rJjfD78oLZN+Qw7LK+Qkb2Y5qnqU47cHAJkwXS0kdMmZVmdyWXtohRb2wgHgmQ4T0lLY68TgVEEiNgY5EzazBOAVQk5IZFpyli60sBcOAM+XRx18cerzr/wm/X45hch1A9JifS6fj0HOFptZAvAKy9VCIpelZNYgASu0aF+OTlzTpW4l9vOA2AsHiJJiTyrT51v2cPpr5tXG+1ycvA/bAQED45WlXAcEOPm5fEQHB+gAgeQxx1rh2fSfTdK8pdksTUumoUivCdJmlkw5A8KFkBPQPW0KXUqWHFp00ppOXEseOV1tM3L6qy2t8qu5y+XDz1pkl77l8vOjRkjPbvxDAISCFy/WNVCl3CdHxUSaV8Wvc6rPpX1Ucsx+A9JMo6/d+lw+DTp2e+E8v/J5mfbCNBNoEoOOV5tZFhJS7ParYRQ2EGyMkA7gnjZ2rDHQDU2b0vblVFd0l6uP2zPl58wUtM69p16eWf71fgiWI0dUyZ1n0VwKBFqqF+vZ7nmTr2KPkXZiA1I3PlcA+WUzy0JCin6shrXkihSjsAH/YZ+cgMlmI85sgo71eZTdD/WS8d+Qi47YNe9lZ6kCjmX/Ib3lrDG7sFEoEERevlh3akNQL56v2PfuQ14v8yokpOi9T5gzoUM4Sv4cGpbmnTiPpWuAD7BPTkimotntaZNOqiVnuVSEUtElaukCjnr9oy/k9Y+WOPacAIrIiyVjWY+R3hawnBojrb1GTl3n5OcKKH3x79SY6FwDk16vFRy7vqBs9uvR50oVcKzPwShsIJgIOR5zeiNODRUaiPLt7UlFe3ByocvmtKqUbRUKgMe8fLFujZE2S+VSjD+ZWOdcBcnJDUjDuJmpR/JZclZoSMl2xDWjsIHgYYS0x9zYiFMDjQai4/cbZN47sWxMhwzkwnqJolUlrVYB8DmvX6xrr4/2/FQk/VJEKzhO9wJZlaN0g/Oz3YDUyc8VYdaSs+TA0tjSaI7reTuFhpRsR1wzChsIHkKOx4KyEadOUctVYhUKgM/54cW6Bpmpy+L9KzpkQN9rD5DTww46bECa/PXmWDly8nNFVKYlZ0qXnOl1ToeUTBue6nEdpBCkUdgA4gg5HgvKRpw6JjpfuVShAHjELy/W9fNrz49OUdP3bj2fk5WjYlahQiiXJWdOh5R0G556NQobgDPoyfGY1xtxZrs3j+6Do2OiMw0f8GMVCkCOL9Zt98mpC9+Ldf16dINRJzY+dfJzhXQKWiqFLDmzQkoh+/Wk2/C02KOwATiHEdIh2SenWM+ZaYx0opJtm4m+XHME46SBINFlQT5+sR6Zr8FBft7ssr6hXqbMn5Lxursm3JVywpkT+/X4NQQC+Br75ARUtlUVr/fm0XHSOm1NhxHo9S/9+9OUVahCp6sV83sCICRBRTc1ta1GzQhfNSoLft/s0tqrRocM2PXlZLtXDSEFCL9mQg4yBYdDZzyXcnR1rhUYt6pQXlS3APhEvkFFP86Mok7xK5yI9cgEZbNLK4gpuyVnXgcxAP5AyEFar77/mZx252sZr3vg3IOy2pvHjYpLIZUmAAGXb1DRys/Ne6XZ1HTbpqI6sS0iv+HPeSmYh8v8nFhyBiDcmnPIBgweiCA39+ZxggYmreDYpe/Ytpc5el43PWXpGhAy+iJbKzjp/gaYVxtv8k9+8a0vzlMGnG0f37wqfp1ObouAnJr6PV7mp0Fm3OBxLDkD4AhCTgQVe2+eXKs8em2qpXTJ++84FawA+EQhQUWrD9nI9roQyHofmcZ3ReZd3TlcNq+JV9WKtMxPA02q4QIAkAtCToT35mlo2mT7u1KrJ8eJvXny6atxo9IEICAKCSq6vCob2V4XAtY+Mumb+qtk5Cu/za96BgA+xWagEd6bJ82Wf47szWP11SRXZfTxf9+32Jz3Q6UJgI8UElS0f0SXV6XbXrliUPy6iMhqs8tdjpOybKtnCbb8Z4vcu/xe+dVrvzLv9TEA+AUhJ6K0iqLN+1qxSaSPk5v6dbmZDit4bMkq814fF9JXY6n9y1Lbz2VVmtK8TDHnnag0AfCZQoKKVhm0f8S6LvnjlG5qGrFqhLXZZVV5VYfjWuExU8t66Pc7t+rZzH/MlFH3j5Lr66+XB955wLzXx3ocAPyA5WoRpkFGm/fT9cvkO8Y5U1+N+qJlq9z63Hvyk/G72VaatAqUav8dJypNAHzICipmulqKvwHSBRXtG9H+EdsG+rpIjY/Ouql/xcKcqmcaZGa9OavT6bZYW/vxaQfEx0GjONgjCOiMEdJwZYyzVn1+8qclGZ+jd3lXef3yI20DC/vkABFmO+lrUPZBxcNRyIHTPnpblxDH0o7e3tLWaio2GmhSKS0plfr/qpduXbq5ettIPXpbq3S6TJHR2wgbRkjD8zHO2fbLaDUn1ZS0bCpNAEJKg4w2uucbVPS6iIyJLmb17MG3708bcJSef/DdB+XMEWe6e99o30Q1eaiEDprQ42yiiiijJwcFj3G2o2Gkd8+uBU9Js/bfOX6/QeY9AQeISGVBl1C9+Uj88Z7fjwcWKjHusZb5VSRVybWCkzA+emXzyqw+XbbXobAlalrBsZuaZx2bsWiGuQ6IIio5cGWMs4aRsw/ZRW5a8O+Mn4MpaUCEZFpG5vGGlJGWRfVscMXgrD5Vttchf9qDk7hEzS7oNLQ0mOvYewhRRCUHro1xvuiI3UzPTSpMSQMiRgOM9n7cfYzInHPi7/WxHrfO65Kp5HHG1oaU1nVwj7XMb++TbKtnp37jVNNzk/ZTlJSa6+AuHTLg5HVA2BByYMuJMc5azan7wd62n4MpaUDEZAowyx6NV3BSdgLqNJLaeCUIntFhApNGTEp7zXd3/q4s+HiB1DfUs1TKRTpFzcnrgLAh5MDVDUOt/Xg0EGXajwdASOkL3UwBZu6lnQNQFhtSovh0PPTZe57dqaKjm4uWdymXeR/Nk5qFNTJl/hSZMGeCaY6H83RMtE5RS97k1aLHq8urzXVAFDFCGmk5NcZZp7UxJQ2IKB0ioEvTnHD4ZSL9dmcstA9s+c8WM0VNhwx89Z+v5NH3H+10jfUCnClf7k5XU4kDCPi+I6xyyQaEHGREQAFQkKUPx3twnMZAAl/QJWlasUnVBK8vuLXiMO/EeWxQWaR9crSCUzO6hoCD0GGfnIhxO4RYY5wBIC9adclG+Y4iLZ+lWNZmw+rnSRhxjOJjype3NMiMGzzOfH91yID24OgSNQIloo6QE3BOLScDANfosjKtumgosQ0wJfHzE34l8ufJNhtSprJta2IdSKCjj3lR5wmmfHlPAw0BEuiIwQMBDzgX3Le406adDU2bzHE9DwCe0/Chy8rSjTKZWCey5wn2G1KmxUACrwVxypcusdPpb3M/mMsUOCCkqOQEeImaVnBSzSrSlw16/sgR1fTPAPCeLifTAGO70Wfd18vNkjekbHxbZOENmT+/XgtPp3w1tjR2aH5P7snxy5Qvux4Wvb/a0bX0sAAhQiWnSIHk1fc/k8eWrDLv9XGhtAcnuYKTSJ9Bz+t1AOALGmCmLhOZ9KTIiX+Iv5+6tHM/TeKGlMO+7WzfD1xZKqUBQSWPM44/jklN/8OlTIOrxxUTaxpZcg+RBjQ9zrhrIDyo5AS0Z0aHDDh5HQAUhRVgnO7n0evgGa2A6LjiThWS1jap+fRTGb/iRhG50dOJeLokTe/PrtqkxzSQzVg0wzTx07QPBB+VnID2zOgUNSevA4BA9/PwotQXQWf+ifPlrgl3yYxhp8hdaxpl3scrZXzLV50n4i1/3NdT4AAEHyHHo54ZpefzXbqmY6K1IpSq20aP63m9DgBC0c+TPJBAqwInzxbpuUN8Lx7ddJQGcu+nfFWNlKPq75dRmzZJ5+i57d88nYhX5J8VU+CAaGG5mkty6ZnJZw8aHSagS960IpQ8bNUKPnqeoQMAQiF5IIH24Gz8TGT+dJtBBmwQ6in9GSX+TNJNxMtl6WIEp8AB8GEl59prr5WDDz5YysvLpXfv3hI1xeiZ0Z6e288YKdWVHZek6WM9zj45AEIlcSDBV5+LPDy584tpD5dDIcdJd0WeiGdNgUsejmDR49Xl1b6ZAgfAp5WcLVu2yMknnyxjxoyRP/zhDxI1xeqZ0SCjY6K1IqSBST+fLlGjggPAUbq0KLGKoo3+XvXB6L3oKOp0Q/TZINQ72U66K/JEPGsKnE5R00CTOIDACj41o2sYOgCEhGsh55prrjHvZ8+eLVFk9czokIEU84BMxcWJnhkNNPkseQOArGhVxHZ/G4+Whfl0ORT8PxEv5RS48v4m4LBPDhAevurJ2bx5s3mzNDc3S1DRMwMgFBUb7XvRZWHJL1atZWE6EKDYQceny6GQNBFP//tI9S+ghxPxNMjomGidoqZDBrQHR5eoUcEBwsVXIee6665rrwCFgdUzk7xPTrUD++QAQFEqNiWl/lsW5tPlULCZiGdbAazzfDCEmQJXPcrTewDgrpJYLJb1DOPa2lqZMcPar8DeW2+9Jbvvvnv7Y12uNnXqVPniiy/yquQMHjxYmpqapKKiQoJKx0T7pWfGT/cCwGcBx/zmPY+x9pOeLO6yMK023bxX5uVQU5fSk+M1P/VyAQg8zQaVlZVZZYOcKjmXXnqpTJ6syxZSGzZsmOSre/fu5i1s/NIzo5uPJleVtG+IqhIQcWkb+X24LMzny6FgMxEPAIosp5DTr18/84bg0YCj/UHJL2F0MIIeZ+Q0EGEZG/k9XhZmVw3w+XIoAEBIe3I+/vhjWb9+vXnf2toqS5YsMcd33XVX2X777d16WqRYoqYVnDSr6s15HUXN0jUggvKuxBRhSlamyW7JG4SyHAoA4GbIufLKK+Xuu+9uf/ytb33LvH/++edl7Nixbj0tbGgPTuISNbugo+f1Oj8sqwNQZHlVYoqwLCxVn1DyZDeWQwEAkujYHFfowAGdaZD8RsApPh0y4OR1AEK6r0mKneC/nrKWQK93c3x0xg0/dR1ubfw6BEJrW6vUN9TL3A/mmvf6GAAiMUIa7tApak5eByBksmnkP2mWSHnf4i0LY8PPUFnw0QLbDThrR9eyASeAYFVy4B86JlqnqKX6Ha0e1/N6HYCIshr5KwbYV2z2PCEeJvY+Kf7e7b4XNvwMVcCZ9sK0DgFHNbY0muN6HgCcRiUnAnSYgI6J1ilqKX5Ha84zdACIOD818rPhZyjokjSt4MRslh3qsRIpkRmLZsi4wePMBp0A4BQqORGh46F1THR1ZcclafqY8dEAOu1rUqyKTd59QjrZbZC7k91QsMWNiztVcJKDTkNLg7kOAJxEJSdCNMjomGidoqZDBrQHR5eoUcEB4Dts+BkK61rWOXodAGSLkBMxGmgYEw0gENjwM/D6lfdz9DoAyBYhBwDgX37qE0LORlaNNFPUdMiAXV+O9uToeb0OAJxETw4AwN/80ieEnOkwAR0TbQWaRNbjmtE1DB0A4DhCDgCgeHQDyBULRZY+HH/PhpChp/vgzBw7U6rKqzoc1wqOHmefHABuYLkaAKA4lj+eor9mRub+Gg1DLFkLLA0yOiZap6jpkAHtwdElalRwALilJBaLdV4k6xPNzc1SWVkpTU1NUlFR4fXtAAAKCThmUlryPznbljDpgIFUQaeQcAQACI1csgHL1QAA7tIqjIYUm8bz9mPzau2XrlnhKDHgqOY18eN6HgCAJIQcAIC7dJlZckjpICbSvCp+nVPhCAAQaYQcAIC7tI8mn+vyDUfIHQMhAIQMgwcAAO7SQQH5XJdvOEJu6HkCEEJUcgAA7tJJaPqiOWmflK+ViFQMil/nRDhC9uh5AhBShBwAgLt0TLBWBYzkoLPt8cS6ziOh8w1HyA49TwBCjJADAHCfLnvSMdEVAzoe1xCTanx0vuEI2aHnCUCI0ZMDACgODTK7H53bpp5WOLLtGamjZ6QQ9DwBCDFCDgCgeDTQDD3M/XCEzOh5AhBihBwAQDjDEdKzep50yIBtX472PA2k5wlAINGTAwBAFNHzBCDECDkAAERVPgMhACAAWK4GAE7Tkbv0jyAo6HkCEEKEHABwErvHe6a1rVUWNy6WdS3rpF95PxlZNVLKeKGeHXqeAIQMIQcAnN49PrmJ29o9PujLf/KpUBWpqrXgowVSt6hO1rZ8Pe64f3l/qR1dK+OHjHf8+QAA/lYSi8XsRqr4QnNzs1RWVkpTU5NUVFR4fTsAkP7F/M17pdlccdukqqlLg7kMKJ8KVZGqWhpwpr0wTWJJ4bJkW/P8zLEzCToAEAK5ZAMGDwCAE8K8e7xVoUr++qwKlZ534mPyXKKmFZzkgKOsYzMWzTDXAQCig5ADAE4I6+7xGg60GmO7j8q2Y/Nq49cV8jF50h6cxCVqnZ8tJg0tDeY6AEB0EHIAwAlh3T0+nwpVEataOmTAyevgEA2wKxaKLH04/p5KGoAiY/AAADghrLvH51OhKmJVS6eoOXkdHMCEQQA+QCUHAJwQ1t3j86lQFbGqpWOidYqaNWQgmR6vLq8216EIitSLBQCZEHIAwClh3D3eqlClCBHxCtWgjhWqfD4mT7oPjo6Jjn/Wjs9nPa4ZXcN+OcVQxF4sAMiEkAMATtIgM3WZyKQnRU78Q/y9jo0OYsDJt0JV5KqWjofWMdFV5VUdjmuFh/HRRRTmCYMAAoeeHABwWth2j7cqVLZ9FnX2AS6fjymABplxg8eZKWo6ZEB7cHSJGhWcIgrrhEEAgUTIAQBkpqFk96Pjv4XXF6naT6PLzdKFiHw+pgAaaEZVj3Llc6PwHitdpLa4R3dZ1/Kx9GuoJ4QCcFVJLBazWzwbuF1NAQCAh7TX5ua9bCcMLijvKXV9d5C1Xbp0WE6o/VQsJwTgRjagJwcAEF7s11I8KXqxNOBMq9pR1pZ1rNo0tjTKtBemyYKPFhT5RgFEAZUcAEA4Oblfi4ajIi27C9P3XSPlhMED4wGnpPO0PZ2ApxWdeSfOY+kaAEezAT05AIDw7teSPM7Y2q8ll5HebG6Zm4RerMVr/i5r/313yktjEpOGlgYzMIJ+KgBOYrkaACBcnNyvhc0tC5owuK56RFaX60Q8AHASIQcAEC5O7dfC5pYF01HeTl4HANki5AAAwsWp/VrY3LJgOiZae26098aOHq8urzbXAYCTCDkAUAimdwVuv5asr2Nzy4LpMAEdE62Sg471uGZ0DUMHADiOwQMAkC8a0v1JJ5/pz8Fmv5a4kvh5va4YYSnidB+cmWNnSt2iOlnb8nUg1AqPBhz2yQHgBkZIA4CT07us31bnMr0LLv58JOlnlMPPJ83mlh3C0tSljJPOQmtbq5mipkMGtAdHl6hRwQGQCzYDBQA30ZDufxpgNMhUDOh4XENJtgE0xeaWHR5PrCPgZEkDjY6JPmrYUeY9AQeAm1iuBgC5yqUhfehhRbwxpNqvJe9NPK2wZLsssY5qHQD4FCEHAHJFQ3rg9mvxPCwBAIqKkAMAuaIhPXqcCEsAgKKhJwcA8p3elWLvj3hD+qDM07sAAIArCDkAkCsa0gEA8DVCDgB4Nb0LAAC4gp4cAMgXDekAAESrkvPhhx/KOeecI0OHDpWePXvK8OHD5aqrrpItW7a49ZQA4F1D+t4nxd9nG3B0D50VC0WWPhx/z546AAD4v5Lz9ttvS1tbm/z2t7+VXXfdVZYtWybnnnuubNy4UW688Ua3nhYA/G/54yn2XZnBMjcAABxQEovF7LbsdsUNN9wgt99+u3zwwQdZXd/c3CyVlZXS1NQkFRUVrt8fABQl4Dx0VnzDULuBBfTzAABQcDYo6uABvaE+ffqkPL9582Zz84lvABAauiRNKzidAo58fWxeLUvXAAAoUNFCznvvvSe/+c1v5Pzzz095zXXXXWfSmfU2ePDgYt0eALhPBxQkLlHrJCbSvCp+HQAAKF7Iqa2tlZKSkrRv2o+TaNWqVTJx4kQ5+eSTTV9OKtOnTzfVHutt5cqV+X1VAOBHOoHNyesAAIAzgwcuvfRSmTx5ctprhg0b1v7/V69eLePGjZODDz5Yfve736X9uO7du5s3AAglHTHt5HUAAMCZkNOvXz/zlg2t4GjA2X///WXWrFlSWsreowAiTPfQ0SlqzWtS9OWUxM/rdQAAIG+upQ4NOGPHjpWdd97ZjIxet26dNDQ0mDcAiCTdQ0fHRCdOU2u37fHEOjYTBQDAr/vkPPPMM2bYgL7ttNNOHc4VcWo1APiLjofWMdG2++TUMT4aAICg7ZOTK/bJARBaOiZap6jpkAHtwdElalRwAABwJBu4VskBAKShgWboYV7fBQAAocQkAAAAAAChQsgBAAAAECqEHAAAAAChQsgBAAAAECqEHAAAAAChQsgBAAAAECqEHAAAAAChQsgBAAAAECpsBopQaG2LyaIV66Vxwyap6tVDRg/tI2WlJV7fFgAAADxAyEHgzVu2Rq55YrmsadrUfmxAZQ+56tgRMnGvAZ7eGwAAAIqP5WoIfMC54L7FHQKOamjaZI7reQAAAEQLIQeBXqKmFZyYzTnrmJ7X6wAAABAdhBwElvbgJFdwEmm00fN6HQAAAKKDkIPA0iEDTl4HAACAcCDkILB0ipqT1wEAACAcCDkILB0TrVPUUg2K1uN6Xq8DAABAdBByEFi6D46OiVbJQcd6rOfZLwcAACBaCDkINN0H5/YzRkp1ZcclafpYj7NPDgAAQPSwGSgCT4PMkSOqzRQ1HTKgPTi6RI0KDgAAQDQRchAKGmjGDO/r9W0AAADAB1iuBgAAACBUCDkAAAAAQoWQAwAAACBUCDkAAAAAQoWQAwAAACBUCDkAAAAAQoWQAwAAACBUCDkAAAAAQoWQAwAAACBUCDkAAAAAQqWL1zcAACiStlaRj14R+XKtyPb9RYYcLFJa5vVdAQDgOEIOAETB8sdF5tWINK/++ljFQJGJM0RGHOflnQEA4DiWqwFAFALOQ2d1DDiqeU38uJ4HACBECDkAEPYlalrBkZjNyW3H5tXGrwMAICQIOQAQZtqDk1zB6SAm0rwqfh0AACFByAGAMNMhA05eBwBAABByACDMdIqak9cBABAAhBwACDMdE61T1KQkxQUlIhWD4tcBABAShBwACDPdB0fHRBvJQWfb44l17JcDAAgVQg4AhJ3ug3PKPSIVAzoe1wqPHmefHABAyLAZKABEgQaZ3Y+OT1HTIQPag6NL1KjgAABCiJADAFGhgWboYV7fBQAArmO5GgAAAIBQIeQAAAAACBVCDgAAAIBQIeQAAAAACBVCDgAAAIBQIeQAAAAACBVCDgAAAIBQIeQAAAAACBVCDgAAAIBQ6SI+FovFzPvm5mavbwUAAACAh6xMYGWEwIacDRs2mPeDBw/2+lYAAAAA+CQjVFZWpr2mJJZNFPJIW1ubrF69Wnr16iUlJSUpE52GoJUrV0pFRUXR7xHO4ucZLvw8w4WfZ7jw8wwPfpbhws8zNY0tGnAGDhwopaWlwa3k6M3vtNNOWV2r/xHwH0J48PMMF36e4cLPM1z4eYYHP8tw4edpL1MFx8LgAQAAAAChQsgBAAAAECqBDzndu3eXq666yrxH8PHzDBd+nuHCzzNc+HmGBz/LcOHn6QxfDx4AAAAAgMhVcgAAAAAgESEHAAAAQKgQcgAAAACECiEHAAAAQKgQcgAAAACESuhCznHHHSc777yz9OjRQwYMGCBnnnmmrF692uvbQo4+/PBDOeecc2To0KHSs2dPGT58uBmnuGXLFq9vDXm69tpr5eCDD5by8nLp3bu317eDHN12222yyy67mL9bDzzwQFm0aJHXt4Q8vfTSS3LsscfKwIEDpaSkRB599FGvbwl5uu6662TUqFHSq1cvqaqqkhNOOEHeeecdr28Lebr99ttln332kYqKCvM2ZswY+etf/+r1bQVW6ELOuHHj5KGHHjJ/yOfMmSPvv/++nHTSSV7fFnL09ttvS1tbm/z2t7+VN998U2666Sa544475Oc//7nXt4Y8aUA9+eST5YILLvD6VpCjBx98UKZNm2Z+0bB48WLZd999ZcKECdLY2Oj1rSEPGzduND9DDa4IthdffFEuvPBCee211+SZZ56RrVu3yne/+13zM0bw7LTTTlJXVyevv/66/OMf/5AjjjhCjj/+ePM6CLkL/T45jz/+uPnNxubNm6Vr165e3w4KcMMNN5jfcnzwwQde3woKMHv2bJk6dap88cUXXt8KsqSVG/1t8a233moe6y8gBg8eLBdffLHU1tZ6fXsogFZyHnnkEfPvJIJv3bp1pqKj4efwww/3+nbggD59+pjXP7q6BRGv5CRav369/PGPfzRLZAg4wdfU1GT+sAMobgVOf6s4fvz49mOlpaXm8auvvurpvQHo/O+k4t/K4GttbZU//elPpiqny9aQu1CGnJqaGtluu+2kb9++8vHHH8tjjz3m9S2hQO+995785je/kfPPP9/rWwEi5dNPPzX/2Pbv37/DcX3c0NDg2X0B6EgrrFolP+SQQ2Svvfby+naQp6VLl8r2228v3bt3l//+7/82ldYRI0Z4fVuBFIiQo8shtKSe7k17OCyXXXaZ/POf/5Snn35aysrK5KyzzpKQr8oLjFx/lmrVqlUyceJE089x7rnnenbvcObnCQBwnvbmLFu2zPz2H8H1zW9+U5YsWSJ///vfTQ/rpEmTZPny5V7fViAFoidH15h+9tlnaa8ZNmyYdOvWrdPxTz75xKwdf+WVVyj3BfBnqZPxxo4dKwcddJDp5dBlMgj2n016coK3XE0n4j388MMd+jb0H179GVIpDzZ6csLhoosuMn8WdXKeTiVFeOjSYJ0wq4OYkJsuEgD9+vUzb/mWb5UOHkCwfpZawdFpefvvv7/MmjWLgBOyP5sIBg2o+mfw2WefbX8hrH+v6mN9YQXAO/p7ah0AokH1hRdeIOCEkP59y2vYEIecbGlpr76+Xg499FDZYYcdzPjoK664wiRgqjjBogFHKzhDhgyRG2+80VQMLNXV1Z7eG/Kj/XE6DETfa4+HluPVrrvuatYfw790fLRWbg444AAZPXq03HzzzaYZ9uyzz/b61pCHL7/80vQ5WlasWGH+PGqzuu4zh2AtUbv//vtNFUf3yrH65CorK80ecwiW6dOny/e+9z3z53DDhg3mZ6vhdf78+V7fWiAFYrlaLs1aP/nJT+SNN94w/wDrZqDay3H55ZfLoEGDvL495ECXNKV6ARWi/2QjZfLkyXL33Xd3Ov7888+bQAt/0/HROsZUX0Ttt99+8utf/9qMlkbw6IsmrZIn0yCrf/ciWMsN7ejqB/07F8GiY6K1Sr5mzRoTVHVjUB2mdeSRR3p9a4EUqpADAAAAADQ5AAAAAAgVQg4AAACAUCHkAAAAAAgVQg4AAACAUCHkAAAAAAgVQg4AAACAUCHkAAAAAAgVQg4AAACAUCHkAAAAAAgVQg4AAACAUCHkAAAAAJAw+f9S3l7DFsu2cwAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-21T11:15:10.610879Z",
     "start_time": "2025-06-21T11:15:10.441919Z"
    }
   },
   "cell_type": "code",
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=3)\n",
    "knn.fit(x_pca,y)\n",
    "y_predict = knn.predict(x_pca)\n",
    "accuracy = accuracy_score(y,y_predict)\n",
    "print(accuracy)"
   ],
   "id": "c2c1ef810a472153",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9466666666666667\n"
     ]
    }
   ],
   "execution_count": 28
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "**PCA实战summary**\n",
    "- 1、通过计算数据对应的主成分（principle components），可在减少数据维度的同时尽可能保留主要信息\n",
    "- 2、未确定合适的主成分维度，可先对数据进行与原数据相同维度的PCA处理，再根据各个成分的数据方差确认主成分维度；\n",
    "- sklearn.decomposition.PCA"
   ],
   "id": "39e0bfab5eeb7734"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": ".venv"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
